Производные классы и умные указатели - PullRequest
2 голосов
/ 29 декабря 2010
class Object { /* */ };

и несколько производных:

class Derived1 : public Object { /* */ };
class Derived2 : public Object { /* */ };

И у меня есть функция, которая создает производные объекты и возвращает указатель на Object;

Object *make()
{
   return new Derived1();
}

Итак, таким образом я должен обернуть возвращаемый объект умным указателем, но какой тип возвращаемого значения использовать?

TYPE? make()
{
   return boost::shared_ptr<Derived1>(new Derived1());
}

Ответы [ 3 ]

7 голосов
/ 29 декабря 2010

вы можете использовать:

boost::shared_ptr<Object> make()
{
return boost::shared_ptr<Object>(new Derived1());
}
4 голосов
/ 29 декабря 2010

Логично, что естественное преобразование будет в boost::shared_ptr<Object>, но если функция всегда возвращает Derived1, то было бы лучше вернуть boost::shared_ptr<Derived1>, чтобы клиенты могли воспользоваться преимуществами лучшей статическойвведите информацию, если хотите.

Почему исходной функции было необходимо выбросить статическую информацию о типе?

2 голосов
/ 29 декабря 2010

Ответ прост:

boost::shared_ptr<Object> make()
{
   return boost::shared_ptr<Derived1>(new Derived1());
}

, поскольку интеллектуальный указатель сохраняет свойство указателя при преобразовании типа.

...