【发布时间】:2013-03-21 07:27:41
【问题描述】:
我有课程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
}
有没有办法解决这个问题?
可以将指向MyObject 实例的指针存储在MyObjectSet 中,但如果可能的话,我想避免这种情况。
【问题讨论】:
-
您是否也反对将智能指针存储到
MyObject? (如果是,为什么?) -
你可以将 GetMyObject 的 retval 设为 const 引用吗?
-
我没有看到允许移动构造函数的问题。它不允许您创建新对象,除非您使现有对象无效,因此您只是将资源从一个实例移动到另一个实例。而且,如果您同时禁止复制和移动,那么您的课程将很难用于任何事情。