Используйте указатель на указатель, если любой класс может изменить значение указателя - например, удалив существующий объект и заменив его новым. Это позволяет обоим классам по-прежнему использовать один и тот же объект, разыменовывая указатель на указатель.
Если вы не заботитесь о том, чтобы объект оставался действительным на протяжении всего жизненного цикла обоих классов.
- Если вложенный класс живет короче, вам не о чем беспокоиться.
- Если это то же самое, при условии, что вы выполняете очистку в правильном порядке (например, сначала вложенный класс, потом объект), тогда вам снова не о чем беспокоиться
- Если вложенный класс может сохраниться после уничтожения владельца, вы должны реализовать способ, обеспечивающий сохранение этого объекта.
Если вам необходимо обеспечить время жизни объекта, это можно сделать с помощью семантики подсчета ссылок, либо вручную, либо через интерфейс интеллектуального указателя.
Для умного указателя хорошим вариантом будет Boost :: shared_ptr. shared_ptr позволяет владельцу объекта совместно использовать несколько указателей. Когда последний shared_ptr выходит из области видимости, объект удаляется.
(обратите внимание, что это не относится к auto_ptr, где объект принадлежит исключительно).
Что нужно знать;
- При использовании boost :: shared_ptr убедитесь, что вложенный класс имеет копию shared_ptr, а не ссылку / указатель.
- std :: auto_ptr ведет себя совершенно по-разному, объекты принадлежат исключительно и не используются совместно
- boost :: shared_ptr может работать только с объектами кучи, например, указатели, возвращаемые при вызове «new»
Пример: * * тысяча тридцать-один
typedef boost::shared_ptr<Interface> shared_interface;
class NestedClass
{
shared_interface mInterface; // empty pointer
}
void NestedClass::setInterface(shared_interface& foo)
{
mInterface= foo; // take a copy of foo.
}
void ParentClass::init( void )
{
// mInterface is also declared as shared_interface
mInterface = new Interface();
mNestedClass->setInterface(mInterface);
}