2016-01-26 3 views
0

Мой код показан ниже.Как инициализировать элемент класса `std :: vector` объекта` std :: unique_ptr` в списке инициализатора конструктора?

#include <memory> 
#include <stdint.h> 

class APodClass 
{ 
    public: 
     int x, y, z; 
}; 

class MyClass 
{ 
    public: 
     MyClass(uintmax_t Width, uintmax_t Height) 
      : WIDTH (Width), 
       HEIGTH (Height), 
       Field (WIDTH * HEIGTH, nullptr) 
     { 
     } 

    private: 
     const uintmax_t WIDTH; 
     const uintmax_t HEIGTH; 
     std::vector<std::unique_ptr<APodClass>> Field; 
}; 

int wmain(int argc, wchar_t * argv[]) 
{ 
    MyClass MyObject(1000, 500); 

    return 0; 
} 

Когда я пытаюсь скомпилировать его, я получаю следующее сообщение об ошибке.

Error C2280 
'std::unique_ptr<APodClass,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': attempting to reference a deleted function 
...\visual studio\vc\include\xmemory0 655 

Что я здесь делаю неправильно. Как исправить этот код?

ответ

1

станд :: unique_ptr не копируемая так что любой конструктор или алгоритм (например, std::generate), что копии элементов не будут работать:

class MyClass 
{ 
    static std::vector<std::unique_ptr<APodClass>> generate(size_t sz) 
    { 
     std::vector<std::unique_ptr<APodClass>> result; 
     result.reserve(sz); 
     for (size_t i = 0 ; i < sz ; ++i) 
      result.emplace_back(nullptr); 

     return result; 
    } 

public: 
    MyClass(uintmax_t Width, uintmax_t Height) 
    : WIDTH (Width), 
    HEIGTH (Height), 
    Field (generate(WIDTH * HEIGTH)) 
    { 
    } 
... 
}; 
0

Как вы можете видеть, конструктор vector(size_type n, const value_type& val = value_type(), const allocator_type& alloc = allocator_type());, что вы использование делает копии аргумента val.

Как известно, unique_ptr не подлежит копированию. Поэтому вы не можете использовать конструктор, который копирует аргумент.

Что вы можете сделать, это инициализировать вектор как пустой. Инициализация по умолчанию достаточна, поэтому нет необходимости вообще использовать список инициализации члена. Чтобы добавить n несъемные элементы в пустой вектор, вы можете использовать петлю и push_back внутри тела конструктора MyClass.

Смежные вопросы