gpt4 book ai didi

c++ - 包含对象的结构 vector

转载 作者:行者123 更新时间:2023-11-30 01:19:16 25 4
gpt4 key购买 nike

我将有一个大型结构,其中包含基本类型、STL 对象 (std::string) 以及库类的对象(我无法修改)。

struct Info {
string name;
int number;
LibClass object;
// ...
}

我想将这个结构的实例填充到一个 vector 中,然后创建一个函数来填充这个 vector 。

vector<Info> list;

void addElement (string myName, int myNumber, LibClass myObject /*, ... */)
{
Info newElement = { myName, myNumber, myObject /*, ... */};
list.push_back(newElement);
}

上面的代码会失败,因为 LibClass 没有指定 vector 实现所需的赋值运算符。如果我更改我的结构(和 addElement 函数参数)以保存指向 LibClass 对象的指针,代码将起作用。但随后我将不得不在我的函数之外进行内存管理(在堆上为每个新元素创建一个 LibClass 对象)。

下一个最好的办法是通过在堆上创建给定堆栈对象的拷贝来在 addElement 函数内进行内存管理,这将使我的调用代码保持干净。但是由于这段代码不是另一个对象的一部分,所以我没有可以再次释放内存的析构函数。

有没有一种方法可以实现这一点,而不必在这段代码之外进行内存分配,也不会把它炸成一个全功能的工厂类?

更新:我无法修改库类,我无法使用 C++11 或辅助库,例如 boost。这些结构在 vector 中基本上是只读的。即使 vector 只会被填充一次,那么也只会发生读取访问。

最佳答案

如果我理解正确,你可能会想到使用 std::shared_ptr<> .您将能够动态分配库,但释放将自动完成。

我想替换 LibClass object;std::shared_ptr<LibClass> object;并实例化 LibClass里面addElement功能。信息将是可复制的,因为 shared_ptr可以移动和复制自身 - 每个拷贝仍将保留对相同 LibClass 的引用实例。另一方面,当您删除单个 Info 的所有实例时项目(无论如何),shared_ptr将负责删除 LibClass实例也是如此。想到shared_ptr作为一种动态创建类然后将其留给自动内存管理的方法。

std::shared_ptr<>是 C++11 的一部分,如果你不能使用后者,你可以使用 Boost 中的等价物: boost::shared_ptr<> .如果这也不是一个选项,您可以自己实现一个共享指针版本 - example .

关于c++ - 包含对象的结构 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21111653/

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