使用指向<Employee>向量的唯一指针向量

CGu*_*utz 9 c++ pointers vector ostream

对于学校作业,我试图使用Employee对象的唯一指针向量来访问Employee数据,但无法弄清楚语法/编译器错误.谁能告诉我我做错了什么?必须以这种方式使用智能指针的向量.

以下是适用的代码:

// Create an Employee
Employee EmpRec;

// Assign value to a uniqueptr
unique_ptr<Employee> TempEmp;
*TempEmp = EmpRec;

// Create a vector of unique_ptr<Employee>
vector<unique_ptr<Employee>> EmpVect;

// Push the TempEmp pointer onto the vector
EmpVect.push_back(TempEmp);

// Iterate through vector, calling display function 
//that prints the values of various data inside the Employee object
for (size_t i = 0; i < EmpVect.size(); ++i){
    (EmpVect[i])->display(cout);
}
Run Code Online (Sandbox Code Playgroud)

这就是我的Display功能的定义方式:

void display(std::ostream& cout) const{
    // print data members using cout <<
}
Run Code Online (Sandbox Code Playgroud)

在尝试编译时,我收到以下错误:

d:\ microsoft visual studio 12.0\_vc\include\xmemory0(593):错误C2280:'std :: unique_ptr> :: unique_ptr(const std :: unique_ptr <_Ty,std :: default_delete <_Ty >>&)':试图引用已删除的功能

Jos*_*eld 14

这样调用push_back会尝试将其复制unique_ptr到矢量中.你不能复制unique_ptrs!相反,您需要将其移动到矢量中:

EmpVect.push_back(std::move(TempEmp));
Run Code Online (Sandbox Code Playgroud)

但是,你确实有另一个问题.您unique_ptr没有初始化为指向任何特定的已分配Employee,但您尝试分配给该对象.这不好.相反,您应该动态分配Employee并将其传递给unique_ptr构造函数:

unique_ptr<Employee> TempEmp(new Employee());
Run Code Online (Sandbox Code Playgroud)

或优选地,使用一个实现std::make_unique(将在C++ 14可用).

  • 您还可以使用 EmpVect.emplace_back( TempEmp ) (2认同)