Не могу сделать базовый класс - PullRequest
0 голосов
/ 05 июля 2019

Код здесь жалуется, что строка с push_back пытается создать объект типа Abstract.

#include <vector>
#include <memory> 

class Abstract
{
public:
    Abstract() {}
    virtual void   f()  = 0;
};

class Derived : public Abstract
{
public:
    Derived()  {}
    void f()  override  {   }
};

int main (int argc, char** argv) 
{
    std::vector<std::unique_ptr<Abstract>> vec;

    vec.push_back (std::make_unique<Abstract>(new Derived)); 

    return 0;
}

Вот сообщения об ошибках:

error C2259: 'Abstract': cannot instantiate abstract class

Я думал, unique_ptr просто возьмёт указатель без размышлений о том, на что он указывает?

Ответы [ 2 ]

4 голосов
/ 05 июля 2019

make_unique<T> создает объект типа T. Всегда . Это в основном делает return unique_ptr<T>(new T(args...));.

Если вы используете new для создания указателя самостоятельно, вы не хотите передавать этот указатель на make_unique. Нет, если вы не делаете make_unique<T*> или что-то, что берет указатель на объект.

Вы можете push_back(std::unique_ptr<Abstract>(new Derived())) или emplace_back(new Derived()), если хотите.

1 голос
/ 05 июля 2019

Вы можете построить объект на месте, используя emplace_back:

vec.emplace_back (new Derived); 
...