Неправильно читаются поля объектов из словаря std::map
Изучая возможности С++ я сделал код в котором для примера определяю класс Bar
с парой полей и "класс-менеджер" в котором есть vector<Bar>
для хранения объектов и массив map<int, Bar*>
, в котором храню указатели на те-же объекты проиндексированный по одному из полей. Идея в том что при добавлении нового объекта Bar в вектор - я записываю указатель на него в map
чтобы получить доступ к этим объектам сразу по полю-индексу. Для простоты поле-индекс в виде простого int
. Добавляю несколько элементов и распечатываю что получилось:
#include <iostream>
#include<map>
#include<vector>
class Bar {
public:
const int x;
const char key;
Bar(int p_x, char p_key): x(p_x), key(p_key) {}
void print() {
std::cout << "Bar: " << this << " x:" << x << " key: " << key <<"" << std::endl;
}
};
class BarManager {
protected:
std::vector<Bar> bars;
std::map<int, Bar*> bars_map;
public:
void add_bar(int x, char key)
{
Bar bar = Bar(x, key);
bars.push_back(bar);
Bar* bar_ptr = &bars.back();
bars_map[x] = bar_ptr;
}
void print_bars()
{
for (Bar& bar: bars) {
bar.print();
}
}
void print_map()
{
for(const auto pair : bars_map) {
int index = pair.first;
const Bar* bar_ptr = pair.second;
std::cout << "index:" << index << " - " << " x:" << bar_ptr->x << " key:" << bar_ptr->key << std::endl;
}
}
};
int main(int argc, char **argv)
{
BarManager bar_mgr;
bar_mgr.add_bar(0, 'a');
bar_mgr.add_bar(0, 'b');
bar_mgr.add_bar(1, 'c');
bar_mgr.add_bar(2, 'd');
bar_mgr.add_bar(3, 'e');
bar_mgr.add_bar(0, 'x');
bar_mgr.print_bars();
std::cout << "==================================================" << std::endl;
bar_mgr.print_map();
return 0;
}
И тут у меня выходит все вроде хорошо:
Bar: 0x5b954c970fe0 x:0 key: a
Bar: 0x5b954c970fe8 x:0 key: b
Bar: 0x5b954c970ff0 x:1 key: c
Bar: 0x5b954c970ff8 x:2 key: d
Bar: 0x5b954c971000 x:3 key: e
Bar: 0x5b954c971008 x:0 key: x
==================================================
index:0 - x:0 key:x
index:1 - x:1 key:c
index:2 - x:2 key:d
index:3 - x:3 key:e
Но если я добавляю поле в класс Bar
, например:
class Bar {
public:
const int x;
int y = 1;
const char key;
Bar(int p_x, char p_key): x(p_x), key(p_key) {}
void print() {
std::cout << "Bar: " << this << " x:" << x << " key: " << key <<"" << std::endl;
}
};
то получаю неверные значения у полей Bar
из map
Bar: 0x58024f3d3ff0 x:0 key: a
Bar: 0x58024f3d3ffc x:0 key: b
Bar: 0x58024f3d4008 x:1 key: c
Bar: 0x58024f3d4014 x:2 key: d
Bar: 0x58024f3d4020 x:3 key: e
Bar: 0x58024f3d402c x:0 key: x
==================================================
index:0 - x:0 key:x
index:1 - x:0 key:
index:2 - x:2 key:
index:3 - x:3 key:e
Пытаюсь понять в чем тут проблема.