storing objects of a different class in a vector in C++
我有一个类user,它将另一个类foo的对象存储在一个向量中。我试图找出创建foo类对象的最佳方法,并将它们存储在类用户的向量中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | class Foo { public: Foo(); Foo(std::string str); std::string name; Foo* GiveMeFoo(std::string arg); }; Foo::Foo() {} Foo::Foo(std::string args):name(args) {} Foo* Foo::GiveMeFoo(std::string arg) { return new Foo(arg) }; class User { public: vector < Foo *> v; vector < Foo> v2; vector < Foo*> v3; void start(); }; void User::start() { const int SIZE = 3; string a[SIZE] = {"one","two","three"}; for (int i = 0; i < SIZE; i++ ){ //method1 Foo *f = new Foo(); f->name = a[i]; v.push_back(f); //method2 Foo f2; f2.name = a[j]; v2.push_back(f2); //method3 Foo f3; v3.push_back(f3.GiveMeFoo(a[k])); } } |
问题1:在方法1、2和3之间,是否有一种做事情的首选方法?有没有更好的方法在本地创建远程类的对象并将它们存储在向量中?
问题2:所有存储在类用户向量中的对象是否都是持久的(例如,即使foo对象消失了,一旦我将这些对象推到用户向量上,那么这些foo对象的副本将持久地存储在向量中,对吗?
除非有其他考虑,方法2是首选的。
vectors(和其他stl容器)存储参数的副本以将_向后推()。
这意味着对于方法1,您要在堆上分配一个foo,然后在向量中存储指向它的指针。如果用户对象被破坏,那么foo对象将泄漏,除非您采取步骤删除它们(如在用户析构函数中删除它们)。
对于方法2,您已经在堆栈上分配了一个foo。然后将此对象复制到向量中。当start()退出时,原始foo将被销毁,但副本仍保留在向量中。如果用户对象被破坏,那么向量和foo也是如此。
对于方法3,您已经在堆栈上分配了一个foo。然后对它调用givemefoo(),该函数在堆上分配另一个foo,然后返回指向它的指针。然后将此指针复制到向量中。当start()退出时,原始foo将被销毁,但堆分配的对象将继续存在。如果用户对象被销毁,那么向量也会被销毁,但如果不在用户的析构函数中手动销毁,则分配给堆的foo会存活并泄漏。
如果需要存储指向对象的指针而不是副本,那么最好使用std::tr1::shared_ptr(如果编译器支持)来管理foo对象的生存期。
在它帮助某人的情况下,如C++ 11,STD::vector(连同一些其他STL容器)现在有能力将实例"放置"到集合中。这样做的好处是避免了可能的额外复制对象或副本。
对于上面的示例,可以使用类似这样的代码:
1 | v.emplace_back(a[i]); |
更多信息:std::vector::emplace_back