私はクラスを持っていMyObjectます。そのすべてのインスタンスは によって所有されるべきでMyObjectSetあり、それを他の場所に構築することはできません。内部では、すべてのインスタンスを格納MyObjectSetするために a を使用しています。std::vector<MyObject>
問題は、 forstd::vector<MyObject>が動作するためには、 のムーブ コンストラクターが public でなければならないことです (のフレンドとして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が、可能であれば避けたいと思います。