수업이 있습니다 A
. 라고 부르겠습니다 . 클래스의 두 서브 클래스가 있습니다 A
있습니다 a
및 b
.
다음 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
. 객체 내부에서 호출 하고 객체 자체를 해제하고 있습니다. 이것이 정의되지 않은 동작 일 수 있으며 운이 좋았을까요? 이 권리를 이해하지 못합니까? 내가해야 할 것보다 더 복잡하게 만들고 있는가?
예, 조심하는 한 유효합니다. 에 대한 구체적인 질문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] 삭제
몇 마디 만하겠습니다