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

标签 c++ vector struct

我将有一个大型结构,其中包含基本类型、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/

相关文章:

c++ - 将整数添加到结构

c++ - 编写自动分配安全复制函数的正确方法以及为什么? C++

java - 如何获取字符串的所有子序列组合(在 Java 或 C++ 等中)

c++ - C++ 中的正则表达式 : Requires compiler support error

c++ - 在 Windows 上编译的控制台应用程序是否可以在使用 DOSBox 的 Linux 和 MAC OS X 上运行?

vector - 如何包装另一种类型并向其添加字段和方法?

c++ - 在 C++ 中,如何存储 SQL 查询并对其进行排序?

c++ - 使用 "at"或 [] 安全地访问 std::vector 的成员

c++ - c++中struct的恼人问题

c++ - 结构和数组的初始值设定项太多