클래스에 대한 C ++ 포인터, 클래스 인스턴스가 해제 된 함수를 호출하는 것이 좋습니다.

TomTsagk

수업이 있습니다 A. 라고 부르겠습니다 . 클래스의 두 서브 클래스가 있습니다 A있습니다 ab.

다음 A과 같은 클래스의 포인터를 만들고 있습니다 .

A *pointer;

프로그램의 어느 시점에서 다음과 같이 포인터를 초기화합니다.

pointer = new a();

다른 시점에서 나는 class의 함수를 실행합니다 A.

pointer->function(&pointer);

이 함수는 클래스 내부에 있습니다 A(따라서 모든 하위 클래스에 있음). 이 함수가 호출 될 때 다른 하위 클래스에 대한 포인터를 변경하고 싶을 가능성이 있습니다. 다음은 시도한 것입니다.

void A::function(A **pointer)
{
    if (something)
    {
        delete *pointer;
        *pointer = new b();
    }
}

이것이 효과가 있지만 이것이 좋은 습관인지 정말 궁금합니다 delete. 객체 내부에서 호출 하고 객체 자체를 해제하고 있습니다. 이것이 정의되지 않은 동작 일 수 있으며 운이 좋았을까요? 이 권리를 이해하지 못합니까? 내가해야 할 것보다 더 복잡하게 만들고 있는가?

Petr

예, 조심하는 한 유효합니다. 에 대한 구체적인 질문delete this 에서 더 많은 토론을 참조하십시오 .

그러나 조심하는 한 유효한 C ++의 다른 것들과 마찬가지로 오류가 덜 발생하는 다른 솔루션을 찾는 것이 좋습니다. 새 포인터를 반환 하는 함수 코드를 재 작업 하고 이전 포인터를 자동으로 파괴하도록 하는 것이 좋습니다 (예 : 스마트 포인터를 통해).

라인을 따라 뭔가 :

struct A {
    static std::shared_ptr<A> function(std::shared_ptr<A>& ptr, int x) {
        if (x > 0)
            return std::make_shared<A>(x);
        else return ptr;
    }

    A(int _x): x(_x) {}

    int x;
};

참고 또한 내가 만든 function()static어쨌든 첫 번째 인수로 객체를 받아 같이. coliru에서 라이브를 참조하십시오 .

사실 저는이 솔루션이별로 마음에 들지 않으며 누군가이 shared_ptr접근 방식을 더 잘 구현할 수 있다면 기뻐할 것입니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관