Почему объект класса ведет себя таким образом?
В моем коде встретилась следующая структура классов, я ее упростил до примера:
#include <iostream>
#include <vector>
using namespace std;
class B {
public:
int counter = 0;
void say()
{
this->counter += 1;
cout << "B Counter: " << this->counter << endl;
}
};
class A
{
public:
static vector<B> list;
static void add()
{
B b;
list.push_back(b);
}
static void foo()
{
for(B b : list)
{
b.say();
}
}
};
vector<B> A::list{};
int main()
{
A::add();
A::foo();
A::foo();
return 0;
}
Ожидаю, что с каждым вызовом A::foo() будет увеличиваться внутренний счетчик объектов B в его статическом векторе A::list. Однако, счетчик увеличивается лишь 1 раз, далее сохраняется так. Ума не приложу, почему именно один раз а потом все, может тут какая-то тонкость, которой я не понимаю? Вывод данного примера:
Counter B: 1
Counter B: 1
Ответы (1 шт):
Исправьте объявление счетчика на
inline static int counter = 0;
Иначе он создается при каждом создании объекта B b, вносимого в list. Вы же туда кладете разные объекты b, и у каждого свой счетчик...
Оказывается, неверно понял вопрос... но удалять эту часть не буду, так как она тоже информативна :) Но на уточненный вопрос дополнительно отвечу — вот здесь
for(B b : list)
b получается по значению, т.е. путем копирования объекта их списка, так что увеличение счетчика у вас происходит в копии объекта, а не у объекта в векторе. Чтобы работало, как вы хотите, используйте ссылку:
for(B& b : list)