Все shared_ptr ссылаются на один и тот же указатель в моем векторе - PullRequest
2 голосов
/ 08 ноября 2019

Я создал вектор вектора класса shared_ptr (_cells).

class Goban
{
  public:
    Goban();
    ~Goban();
  private:
    vector<vector<shared_ptr<Cell>>> _cells;
};

Я инициализирую так:

Goban::Goban() : _cells(18, vector<shared_ptr<Cell>>(18, make_shared<Cell>()))
{
}

Проблема в том, что все указатели относятся ктот же указатель динамически (если я правильно понял). Поэтому, когда я изменяю элемент в своем классе Cell, используя мой вектор, он меняет все остальные элементы.

Ответы [ 3 ]

4 голосов
/ 08 ноября 2019

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

Это потому, что вы используете конструктор вектора, который создает N копий аргумента значения. Копия общего указателя указывает на общий объект.

Я хочу отдельный указатель

Тогда не используйте этот конструктор вектора. Вы можете написать цикл, который вызывает make_shared для создания каждого элемента, и цикл, который повторяет это для каждого вектора.

2 голосов
/ 08 ноября 2019

Чтобы получить 18x18 различных shared_ptr с, правильный способ инициализации _cells может быть:

Goban::Goban() : _cells(18, std::vector<std::shared_ptr<Cell>>(18))) {
    for (auto& cs : _cells)
        for (auto& c : cs)
            c = std::make_shared<Cell>();
}

или

Goban::Goban() : _cells(18) {
    for (auto& cs : _cells) {
        cs.resize(18);
        for (auto& c : cs)
            c = std::make_shared<Cell>();
    }
}
1 голос
/ 08 ноября 2019

Просто явно инициализируйте ваш вектор в теле конструктора вместо списка инициализатора.

Goban::Goban()
{
    for (int i = 0 ; i < 18; i++) {
        _cells.push_back(make_shared<Cell>());
    }
}
...