使用C ++将不同类的对象存储在向量中

时间:2011-03-09 03:51:34

标签: object vector

我有一个类user,它在向量中存储另一个类foo的对象。我想弄清楚创建类foo对象的最佳方法是什么,并将它们存储在类user的向量中。

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:所有被存储在类User的向量中的对象是否持久化(例如,即使foo对象消失,一旦我将这些对象推送到用户的向量上,那么这些foo对象的副本将被持久存储在向量,对吗?

2 个答案:

答案 0 :(得分:1)

除非有其他考虑,否则方法2是首选。

Vectors(和其他STL容器)将参数的副本存储到push_back()。

这意味着对于方法1,您在堆上分配Foo,然后在向量中存储指向它的指针。如果销毁User对象,除非您采取措施删除它们,否则Foo对象将泄漏(例如在User析构函数中删除它们)。

对于方法2,您已在堆栈上分配了一个Foo。然后将该对象复制到向量中。当start()退出时,原始Foo被销毁,但副本仍然存在于向量中。如果User对象被销毁,那么向量也是如此,那么就是Foo。

对于方法3,您已在堆栈上分配了一个Foo。然后在其上调用GiveMeFoo(),在堆上分配另一个Foo,然后返回指向它的指针。然后将该指针复制到向量中。当start()退出时,原始的Foo将被销毁,但堆分配的对象将存活。如果User对象被销毁,那么向量也是如此,但是分配给Foo的堆仍然存在并且泄漏,除非你在User的析构函数中手动销毁它。

如果您需要存储指向对象而不是副本的指针,那么最好使用std :: tr1 :: shared_ptr(如果您的编译器支持它)来管理Foo对象的生命周期。

答案 1 :(得分:0)

如果它对某人有帮助,从C ++ 11开始,std :: vector(以及其他一些STL容器)现在可以使用#34; emplace&#34;集合中的一个实例。这样做的好处是可以避免可能的额外重复对象或副本。

对于上面的例子,可以使用这样的代码:

v.emplace_back(a[i]);

更多信息:std::vector::emplace_back