繁体   English   中英

包含对象的结构的向量

[英]Vector of structs containing objects

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

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

我想将此结构的实例填充到向量中,然后创建一个函数来填充该向量。

vector<Info> list;

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

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

第二件事是通过在堆上创建给定堆栈对象的副本来在addElement函数内部进行内存管理,这将使我的调用代码保持整洁。 但是由于此代码不是另一个对象的一部分,因此我没有析构函数可以再次释放内存。

有没有一种方法可以实现此目的而不必在代码之外进行内存分配,又不必将其分解为功能齐全的工厂类呢?

更新:我无法修改库类,无法使用C ++ 11或boost等辅助库。 向量内部的结构基本上是只读的。 甚至向量也只会被填充一次,那么只会发生读访问。

如果我正确理解了所有内容,那么您可能会考虑使用std::shared_ptr<> 您将能够动态分配库,但是释放将自动完成。

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

由于std::shared_ptr<>是C ++ 11的一部分,因此,如果无法使用后者,则可以使用Boost: boost::shared_ptr<>等效功能。 如果那也不是一个选择,那么您可以自己实现共享指针的版本- 例如

您显然已经有一个复制构造函数,否则按值传递将失败。 因此,向量增长应该不是问题(尽管您可能必须避免从向量的开始或中间删除元素)。

对于构造,可以在C ++ 11中使用emplace_back

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM