我们的代码中有一个类,比如class C
。我想创建一个类C
的对象向量。但是,复制构造函数和赋值运算符都有意声明为private
。我不想(也许是不允许)改变它。
有没有其他干净的方法可以使用/定义vector<C>
?
答案 0 :(得分:8)
您可以改为使用vector<C*>
或vector<shared_ptr<C>>
。
答案 1 :(得分:1)
答案 2 :(得分:1)
不,不是,std::vector
需要可分配的概念。 C的作者必须有充分的理由禁止这一点,你必须坚持他们提供的任何内容来复制/分配C
的实例。要么使用上面建议的指针,要么C
提供其他机制来复制/分配自己。在后一种情况下,您可以为C
编写可分配的代理类型。
答案 3 :(得分:1)
我设法通过只使用两个朋友来实现:
template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
friend class std::vector;
template<typename _T1, typename _T2>
friend void std::_Construct(_T1* __p, const _T2& __value);
将它们放入你的班级声明中,瞧!
我正在使用gcc 5.3.1。
答案 4 :(得分:1)
您可以在此处使用 move构造函数。
#include<iostream>
#include<vector>
class Road
{
Road(const Road& obj){} //copy constructor
Road& operator=(const Road& obj){ return *this; } //copy assignment
public:
/*May use below commented code as well
Road(const Road&)=delete;
Road& operator=(const Road&)=delete;
*/
Road()=default; //default constructor
Road(Road&& obj){} //move constructor
void display(){ std::cout<<"Object from myvec!\n"; }
};
int main()
{
std::vector<Road> myVec;
Road obj;
myVec.push_back(std::move(obj));
myVec[0].display();
return 0;
}