c – 保持不可构造对象的向量

我有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中完成的,因此需要它的友谊.

点赞