2010-08-12 5 views
0

목록에있는 일부 개체에 대한 포인터를 저장하는 mother 클래스가 있습니다. 나는이 물건들이 파괴되었을 때 목록에서 스스로 분리 해주기를 바란다. 누구든지이 작업을 수행 할 수있는 좋은 방법을 제안 할 수 있습니까?자동 분리 개체?

답변

1

조 방법이 목록에있는 개체의 컨테이너 참조 (또는 포인터)를 저장하는 것입니다 전화 자신의 소멸자에서 자신을 제거 : 이것은 Contained 클래스가 아닌 복사 가능한 만드는 것을

class Contained; 
class Container { 
    std::list<Contained*> children; 
public: 
    ... 
    void goodbye(Contained*); 
}; 
class Contained { 
    Container& c; // you set this in the constructor 
public: 
    ~Contained() { c.goodbye(this); } 
}; 

참고.

쉬운 방법은 이미 이러한 기능을 제공하는 일부 프레임 워크를 사용하는 것입니다. 예 : Qt를 사용한다면 QObject에서 Contained 클래스를 파생시키고 QPointer<Contained>을 컨테이너에 저장하면됩니다. 포함 된 오브젝트가 삭제되면 QPointer은 0으로 설정됩니다.

또는, boost::shared_pointer 같은 일부 메모리 관리 기능을 사용하는 경우, (나는 자식 개체가 죽었을 때, 그렇지 않으면 최고 알고, 컨테이너가 Contained 객체를 소유하고 있지 않은 가정은), 당신은 Container에 약한 포인터를 사용합니다 비슷한 기능을합니다.

+0

감사합니다. 예 이런 식으로 생각했지만 문제는 자식 개체가 소멸 될 때까지 부모 개체가 존재할 것이라고 보장 할 수 없습니다. (나는 그것이 "엄마"라고 부르는 것은 약간의 오도 된 XD라고 생각한다). 엄마가 자식보다 먼저 파괴된다면, 자식의 소멸자가 호출 될 때 나쁜 일이 일어날 것입니다 ... – user418680

+0

약한 포인터 방법이 저에게 효과적 일 수 있습니다. 내가 그것을 들여다 볼게. 고맙습니다. – user418680

+0

마지막 제안의 문제점은 개체가 죽을 때 약한 포인터가 목록에서 자동으로 제거되지 않는다는 것입니다. 날로 커지는 포인터의 목록을 피하려면 좀 더 많은 작업이 필요합니다. –

0

당신은 그 클래스에 어머니 클래스를 참조/포인터를 추가 할 수 있으며 소멸자가 호출 될 때 그들은 mother.Detach(this)