Изменение одного элемента в двумерном векторе изменяет все элементы? - PullRequest
0 голосов
/ 23 марта 2019

Я кодирую клетчатую настольную игру, в которой доска представляет собой двумерный вектор, в котором содержится объект Square, а Square содержит Piece.Используя вложенный цикл for, я инициализирую новый объект Square в каждом слоте в векторе 8x8 - но когда я добавляю Piece к одному Square, он добавляет Piece к каждому отдельному Square.Я думаю, что, так или иначе, каждый слот в векторе указывает только на один Square, хотя я каждый раз инициализирую новый Square.

Я пробовал это с двумернымвектор объектов Square, а также вектор Square указателей.В настоящее время я использую вектор указателей: vector<vector<Square*>> _board;

    // initializing an empty board
    _board = {{},{},{},{},{},{},{},{}};

    // adding a new Square to each of the 8x8 slots
    string colorAlternator = WHITE;
    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            _board[i].push_back(new Square(colorAlternator, make_tuple(i,j)));
            if (colorAlternator == WHITE) {
                colorAlternator = BLACK;
            } else {
                colorAlternator = WHITE;
            }
        }
    }

    // placing a piece 
    /* placePiece() is a function of Square
     * (p2Pieces.at(0) is a piece being pulled from elsewhere)
     */
    _board[0][1]->placePiece(*p2Pieces.at(0));

В другой функции, называемой view(), она выводит визуализацию платы (извините, моя не элегантная реализация, она будет исправлена ​​с помощьюв ближайшее время цикл for!):

for (int i = 7; i >= 0; i--)
    {
        cout << BORDER << endl;
        cout << i + 1 << " " << "| "
             << board[i][0]->displayToken() << " | "
             << board[i][1]->displayToken() << " | "
             << board[i][2]->displayToken() << " | "
             << board[i][3]->displayToken() << " | "
             << board[i][4]->displayToken() << " | "
             << board[i][5]->displayToken() << " | "
             << board[i][6]->displayToken() << " | "
             << board[i][7]->displayToken() << " | " << i + 1 << endl;
    }

Это должно печатать каждые Square как пустые, за исключением того, который я поместил в Piece - но он печатает каждый Square как содержащийPiece Я только что добавил.

Есть идеи, что заставляет каждый слот в векторе связываться с одним и тем же Square?(Или это даже то, что происходит?)

обновление: вот реализация для placePiece(), displayToken() и поддерживающий метод containsPiece() в классе Square:

Piece* _piece;

void Square::placePiece(Piece &piece) {
    _piece = &piece;
}

bool Square::containsPiece() {
    return _piece != nullptr;
}

string Square::displayToken() {
    string displayStr = "  ";

    if (containsPiece()) {
        displayStr = _piece->getToken();
    }

    return displayStr;
}
...