包含对象的结构传染媒介

时间:2014-01-14 10:49:20

标签: c++ vector struct

我将有一个包含基本类型的大型结构,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没有指定向量实现所需的赋值运算符。 如果我更改我的struct(和addElement函数参数)以保存指向LibClass对象的指针,代码将起作用。但是我必须在我的函数之外进行内存管理(在堆上为每个新元素创建一个LibClass对象)。

接下来最好的事情是在addElement函数内部通过在堆上创建给定堆栈对象的副本来执行内存管理,这将使我的调用代码保持干净。但是因为这段代码不是另一个对象的一部分,所以我没有析构函数,我可以再次释放内存。

有没有一种方法可以实现这一点,而无需在此代码之外进行内存分配,而不必将其作为一个功能齐全的工厂类?

更新:我无法修改库类,我无法使用C ++ 11或助手库,如boost。结构在向量内基本上是只读的。即使向量只会被填充一次,那么只会进行读取访问。

2 个答案:

答案 0 :(得分:4)

如果我理解了所有内容,您可以考虑使用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

答案 1 :(得分:1)

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

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