Вектор shared_ptr абстрактного класса баса, указывающего на производные классы - PullRequest
0 голосов
/ 24 марта 2020

Я нахожусь в классе, где я должен создать вектор общих указателей с абстрактным базовым классом и двухуровневой иерархией для производных классов.

class Base
{
   virtual string returnName() = 0;
};

class DerivedOne : public Base
{
private:
   string name;

public:
   DerivedOne()
   {name = "Derived";}

   virtual string returnName()
   {return name;}
};

class DerivedTwo : public DerivedOne
{
private:
   string secondName;

public:
   DerivedTwo()
   {secondName  = "DerivedTwo";}

   virtual string returnName()
   {return secondName;}
};

int main()
{
   vector<shared_ptr<Base>> entities;
   entities.push_back(new DerivedOne());

   return 0;
}

Моя проблема заключается в добавлении производного класса до конца вектора с помощью push_back() и при компиляции он говорит no matching function for call to ‘std::vector<std::shared_ptr<Base> >::push_back(DerivedOne*)

Как бы я добавил инициализированный производный класс к вектору?

Ответы [ 2 ]

3 голосов
/ 24 марта 2020

Вам следует избегать использования необработанных new вообще. Вместо этого вы должны использовать std::make_shared для выделения ваших объектов, которыми будут управлять std::shared_ptr s:

entities.push_back(std::make_shared<DerivedOne>());

std::make_shared возвращает std::shared_ptr недавно выделенному объекту, а не необработанному указателю. Мало того, что std::vector::push_back работает в этом случае, это также меньше вероятность утечки памяти при исключениях.

0 голосов
/ 24 марта 2020

Вам нужно заменить эту строку на

entities.emplace_back(new DerivedOne());

, потому что вы не хотите push_back a Base*, а скорее std::shared_ptr<Base>. Использование emplace позволит использовать Base* в конструкторе std::shared_ptr<Base>, который затем будет добавлен в ваш вектор.

...