хранение объектов другого класса в векторе в C ++ - PullRequest
1 голос
/ 09 марта 2011

У меня есть класс user, который хранит объекты другого класса foo в векторе. Я пытаюсь выяснить, каков наилучший способ создания объектов класса foo и сохранить их в векторе класса пользователя.

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 &lt Foo *> v;
        vector &lt Foo> v2;
        vector &lt Foo*> v3;
        void start();
};

void User::start()
{
    const int SIZE = 3;
    string a[SIZE] = {"one","two","three"};
    for (int i = 0; i &lt 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 ]

1 голос
/ 09 марта 2011

Если нет других соображений, предпочтителен метод 2.

Векторы (и другие контейнеры 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.

0 голосов
/ 11 января 2018

В случае, если кому-то, начиная с C ++ 11, это помогает, std :: vector (вместе с некоторыми другими контейнерами STL) теперь может «включать» экземпляр в коллекцию. Преимущество этого состоит в том, что вы можете избежать возможного дублирования объекта или копии.

Для приведенного выше примера можно использовать такой код:

v.emplace_back(a[i]);

Дополнительная информация: std :: vector :: emplace_back

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...