Чтобы дать наиболее точный ответ на этот вопрос, необходимо предоставить информацию о том, должен ли o
управлять жизненным циклом предоставленного Foo, и, если нет, жизненным циклом o
.
Во-первых, это может работать нормально, это зависит от того, что o будет делать с предоставленным Foo.
Я знаю, что это не сработает:
Foo* y = &x;
o->setFoo(y);
Поскольку «x» - локальная переменная, поэтому она будет уничтожена, а указанный мною указатель не будет указывать на ничто.
Хорошо, допустим, что o
имеет тип Bar
1 Бар управляет Foo - т.е.удалит Foo.
Панель будет уничтожена, при этом она должна сделать что-то, чтобы удалить Foo. В зависимости от того, что вам нужно сделать с Foo, чтобы настроить его, вы можете перейти к простому
{
std::auto_ptr<Bar> o = new Bar();
o->setFoo(new Foo());
o->DoStuff();
}
или чуть более сложный
{
std::auto_ptr<Foo> y = new Foo(...);
y->config();
o->setFoo(y.release());
}
2 Бар не управляет Foo - т.е.попробуйте удалить Foo
Если Bar не управляет Foo, то это ваша работа, но вполне вероятно, что Bar должен быть уничтожен до того, как Foo
2.1 позволит предположить, что Bar используется только втекущая область действия
Здесь Bar будет уничтожен до того, как Foo
{
Foo y;
std::auto_ptr<Bar> o = new Bar();
o->setFoo(&y);
o->DoStuff();
}
2.2 позволит предположить, что Bar используется только во внутренней области видимости
SomeFunc( Foo *y );
{
std::auto_ptr<Bar> o = new Bar();
o->setFoo(y);
o->DoStuff();
}
{
Foo y;
SomeFunc( &y );
}
2.3 позволяет предположить, что у вас есть Bar, который будетиспользуется в различных областях
std::auto_ptr<Foo> y = new Foo();
std::auto_ptr<Bar> o = new Bar();
{
o->setFoo(y.get());
}
{
o->DoStuff();
}
, а затем могут быть предоставлены дополнительные примеры, основанные на том, как вы работаете с Foo для нескольких баров, включая контейнеры и т. д.