在对象之间共享变量

C++ Sharing variable between objects.

本文关键字:共享变量 之间 对象      更新时间:2023-10-16

我有一个小问题,我希望两个不同的类能够共享和更改另一个类对象。

我有一个HumanPlayer类,一个ComputerPlayer类和一个Board类。两个玩家类需要能够与一个Board类进行交互。我认为我可以将同一个Board对象的引用传递给每个类,但它似乎并没有按照我想要的方式工作。下面是main中的部分内容,我会尽可能描述一下发生了什么:

//main.cpp

    Board *board2 = new Board();
    board2->setBoardSize(5); 
    board2->initPits(); 
    HumanPlayer firstPlayer(*board2, *menu, menu->askForFirstTurn(), true); 
    firstPlayer.removeFromPit(3);  
    board2->showBoard();

firstPlayer.removeFromPit(3);应该只是将board类中的数组中的值设置为零。它确实做到了。如果我要从FirstPlayer类的代码中显示棋盘,它将显示更改。但是当我调用board2->showBoard()时,好像什么都没有改变。它仍然是原始的未改变的板。我真正想要发生的是有我的firstPlayer和secondPlayer类工作在一个共享板对象。我只是不确定如何正确地实现这个现在。

谢谢你们所有人的帮助。如果你需要更多的信息,请告诉我。

听起来你正在复制板对象,而不是通过引用传递它。你的播放器类的构造函数应该是这样的:

class Player
{
public:
    Player(Board& board) // REFERENCE TO Board
       : the_board_(board) // initialize the reference
    {
    }
protected:
   Board& the_board_;  // REFERENCE to Board
};

如果您在任何地方(在构造函数签名或在类成员变量上)缺少&操作符,那么您将制作将在您的类中使用的板的副本。

HumanPlayer firstPlayer(*board2, *menu, menu->askForFirstTurn(), true);

通过一个值传递第一个参数。删除*并将其添加到firstPlayer函数的声明中

您可能没有自始至终使用引用。有两件事需要检查:

  1. HumanPlayer的构造函数必须以board作为参考(Board&)。检查那块木板。参数的类型。否则,当您调用构造函数时,您将隐式地复制Board,以便构造函数可以按值获取Board。

  2. HumanPlayer的成员变量类型必须为board &也否则,当您设置成员变量时,您将隐式地复制来自原始Board对象的数据。请记住,当使用引用作为成员变量时,您需要使用构造函数初始化列表而不是赋值。

我最好的猜测是您的HumanPlayer的构造函数的声明看起来像:

HumanPlayer( Board board, Menu menu, int askForTurn, int otherBoolean );

所以当你用

调用时
HumanPlayer firstPlayer(*board2, *menu, menu->askForFirstTurn(), true);

您实际上使用board2副本来初始化firstPlayer,而不是引用它。

如果这确实是你的代码看起来的样子,你需要确保HumanPlayer的构造函数被声明为接收一个引用到board(可能还有menu?)。它看起来像:
HumanPlayer( Board& board, Menu& menu, int askForTurn, int otherBoolean );