gpt4 book ai didi

c++ - 保留不可构造对象的 vector

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:11:30 26 4
gpt4 key购买 nike

我有课 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 内的实例相反,但如果可能的话,我想避免这种情况。

最佳答案

需要申报std::allocator<MyObject>作为 friend :

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 内部完成的,因此需要它的友好关系。

关于c++ - 保留不可构造对象的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15722834/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com