C ++: обновление векторной переменной-члена класса - PullRequest
0 голосов
/ 26 октября 2019

У меня есть вектор в качестве члена класса "B". У него есть свои функции set и get:

setVector(vector<A*>)
getVector()

Я заинтересован в заполнении этого вектора другой функцией, которая использует объект этого класса "B". Поэтому я создал новые объекты класса «A» и сделал следующее, чтобы по ошибке обновить векторную переменную-член класса «B»:

A* obj = new A;
B b;
B.getVector().push_back(obj);

Произошло то, что push_back не работал. Другими словами, когда я пытаюсь увидеть переменную-член с помощью отладчика, я вижу, что векторная переменная-член по-прежнему имеет емкость 0, как будто я ничего не нажимаю на нее.

Я попытался изменить свою реализацию на:

vector<A*> tempVector;
B b;
A* obj = new A;
tempVector.push_back(obj);
b.setVector(tempVector);

И это сработало, как и ожидалось.

Я хотел понять, почему это первое поведение было ошибкой? Как я понимаю конструктор класса B должен создавать вектор по умолчанию. Поэтому, когда я использую функцию getVector (), она должна вернуть мне созданный вектор, а затем я могу нажать на него. Вот я и хотел узнать, что я не так сделал в этой ситуации?

Ответы [ 2 ]

2 голосов
/ 26 октября 2019

Возможно, проблема в типе возврата getVector(). Предполагая, что он определен как vector<A*> getVector(), он возвращает вектор по значению, что означает, что вы сделали push_back для копии вектора, но не для фактического члена вектора.

Если вы хотитечтобы иметь возможность изменять вектор вне класса, все, что вам нужно сделать, это изменить сигнатуру функции, чтобы вместо этого передать ее по ссылке: vector<A*>& getVector(). Это обеспечит внесение изменений (таких как push_back) в переменную-член.

0 голосов
/ 26 октября 2019

Подпись getVector(), вероятно, похожа на std::vector<A*> getVector(). Это вернет копию фактического вектора. Затем вы push_back копируете вектор, но никогда не изменяете переменную-член. Вы хотите вернуть ссылку:

std::vector<A*> &getVector();
const std::vector<A*> &getVector() const;
...