Я рассуждаю о лучшем подходе к возврату ссылок на объекты, созданные внутри метода, как в следующей ситуации:
class A{
public:
A(){}
~A(){}
};
class Foo{
public:
Foo(){}
~Foo(){}
A& create(int random_arg){
// create object A and return its reference
}
};
void other_method(){
Foo f;
A a = f.create();
// do stuff with a
{
Я рассмотрел три возможных решения:
создать необработанный указатель и вернуть ссылку, но это плохо, потому что нет гарантии, что объект будет правильно удален:
A& create(int random_arg){ A* a = new A(); return *a; }
создайте shared_ptr и верните shared_ptr по значению. Таким образом, shared_ptr позаботится об удалении объекта:
shared_ptr<A> create(int random_arg){ boost::shared_ptr<A> a_ptr(new A()); return a_ptr; }
создайте shared_ptr и верните ссылку:
A& create(int random_arg){ boost::shared_ptr<A> a_ptr(new A()); return *a_ptr; }
Второе решение кажется наиболее часто используемым, но таким образом мне приходится распространять shared_ptr в приложении, и я бы предпочел иметь ссылки, а лучше const
ссылок.
Как вы думаете, как лучше всего поступить в этой ситуации? Есть ли другие возможности, которые я не рассмотрел?
A a; return a;
. Следуйте принципу KISS. - person Jonathan Wakely   schedule 12.03.2015A& create() { A a; return a; }
который имеет ту же проблему, что и (3) - person Jonathan Wakely   schedule 12.03.2015