Вектор-член не поддерживает элементы при попытке вытолкнуть из функции-члена - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть статическая функция-член, которая инициализирует Object1, который содержит вектор-член Object2. Object2 имеет вектор-член строк.

Я пытаюсь добавить серию строк в вектор Object2. Используя функцию-член Object2 для вставки строки в вектор, она не поддерживает элементы при каждом вызове функции.

Например, внутри функции каждый раз, когда она нажимает, она печатает, что размер вектора равен 1, хотя он должен увеличиваться каждый раз.

Мне интересно, есть ли какая-то проблема выделения памяти, которая создает это.

Вектор объявлен в определении класса, но не инициализирован в конструкторе.

Учитывая, что вектор пуст, мне неясно, нужно ли его инициализировать в векторе, и если да, то как?

class Object1 {
    private:
        vector<Object2> container;
}


class Object2 {
    protected:
        vector<string> container2;

    public:
        void add_string(string to_be_added)
        {
            container2.push_back(to_be_added);
            cout << container2.size(); // always prints 1
        }
}


void object1_static_member_function()
{
    Object1 obj1;

    //assume container2 is loaded with values
    for(Object2 obj2 : obj1.container)
    {
        obj2.add_string("test string");
        obj2.add_string("test string2");
        obj2.add_string("test string3");
    }
}

Комментируемая строка должна увеличиваться при каждом проходе по одному и тому же вектору объекта, но она всегда равна 1 (предполагая, что это 0 в начале функции, и, следовательно, никогда не будет эффективно сохранять новый элемент)

РЕДАКТИРОВАТЬ: изменение цикла for для доступа по ссылке решило проблему, большое спасибо. Я признаю, что мой вопрос был несколько неясным, поэтому я благодарен комментаторам за помощь в его расшифровке

1 Ответ

1 голос
/ 19 апреля 2019

просто замените for(Object2 obj2 : obj1.container) на for(Object2 & obj2 : obj1.container), чтобы не изменять копию


Программа использует измененную версию вашего кода, чтобы показать

#include <vector>
#include <string>
#include <iostream>

using namespace std;

class Object2 {
    protected:
        vector<string> container2;

    public:
        void add_string(string to_be_added)
        {
            container2.push_back(to_be_added);
            cout << container2.size() << endl; // always prints 1
        }
};

class Object1 {
    public:
        Object1(int n) { container.resize(n); }
        void function();
    private:
        vector<Object2> container;
};

void Object1::function()
{
    //assume container2 is loaded with values
#ifdef REF
    for(Object2 & obj2 : container)
#else
    for(Object2 obj2 : container)
#endif
    {
        obj2.add_string("test string");
        obj2.add_string("test string2");
        obj2.add_string("test string3");
    }
}

int main()
{
  Object1 obj1(1); /// modified

  obj1.function();
  obj1.function();
}

Компиляция и выполнение безссылка:

pi@raspberrypi:/tmp $ g++ -pedantic -Wall -Wextra v.cc
pi@raspberrypi:/tmp $ ./a.out
1
2
3
1
2
3

Компиляция и выполнение с ссылкой:

pi@raspberrypi:/tmp $ g++ -pedantic -Wall -Wextra -DREF v.cc
pi@raspberrypi:/tmp $ ./a.out
1
2
3
4
5
6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...