Неправильно читаются поля объектов из словаря 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

Пытаюсь понять в чем тут проблема.


Ответы (0 шт):