我有MyObject类.它的所有实例都应该由MyObjectSet拥有,并且不应该在其他任何地方构造它.在MyObjectSet中,我使用std :: vector< MyObject>存储所有实例.
问题是,对于std :: vector< MyObject>要工作,MyObject的移动构造函数必须是公共的(仅仅添加std :: vector< MyObject>作为MyObject的朋友)是不够的.
class MyObject {
MyObject(int n);
friend class MyObjectSet;
public:
MyObject(MyObject&&) = default; // without this, it doesn't compile
};
class MyObjectSet {
std::vector<MyObject> MyObjects;
public:
MyObject& GetMyObject(int some_param);
};
但是如果我公开它,就可以从其他地方实例化MyObject.
void SomeUnrelatedFunc(MyObjectSet& set) {
MyObject m(std::move(set.GetMyObject(0))); // this shouldn't be possible
}
有什么方法可以解决这个问题吗?
可以在MyObjectSet中存储指向MyObject实例的指针,但是如果可能的话我想避免这种情况.
最佳答案 你需要声明std :: allocator< MyObject>作为一个朋友:
class MyObject {
MyObject(int n);
friend class MyObjectSet;
friend std::allocator<MyObject>;
};
然后使用vector :: emplace_back()实际构造对象.
class MyObjectSet {
std::vector<MyObject> MyObjects;
public:
MyObject& GetMyObject(int some_param)
{
MyObjects.emplace_back( some_param );
return MyObjects.back();
}
};
emplace_back()具有调用MyObject构造函数的作用,将some_param作为int参数传递给构造函数,并将创建的对象插入到列表的后面.构造调用是在std :: allocator中完成的,因此需要它的友谊.