我遇到了一个小问题,我希望两个不同的类能够共享和更改另一个类对象。
我有一个HumanPlayer类,一个ComputerPlayer类和一个Board类。两个玩家类需要能够与一个Board类进行交互。我以为我可以将对同一个Board对象的引用传递给每个类,但它看起来并不像我想要的那样工作。这是主要内容的一部分,我将尽可能地描述正在发生的事情:
// 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类在一个共享板对象上工作。我现在还不确定如何正确实现这一点。
谢谢大家的帮助。如果您需要更多信息,请与我们联系。
答案 0 :(得分:3)
听起来你正在复制棋盘对象,而不是通过引用传递它。您的播放器类的构造函数应如下所示:
class Player
{
public:
Player(Board& board) // REFERENCE TO Board
: the_board_(board) // initialize the reference
{
}
protected:
Board& the_board_; // REFERENCE to Board
};
如果您在任何地方(在构造函数签名或类成员变量中)缺少&
运算符,那么您将复制将在您的类中使用的板。
答案 1 :(得分:1)
HumanPlayer firstPlayer(*board2, *menu, menu->askForFirstTurn(), true);
您将第一个参数传递给一个值。
删除*
并将其添加到firstPlayer
函数
答案 2 :(得分:1)
您可能没有完全使用引用。有两件事需要检查:
HumanPlayer的构造函数必须将该板作为参考(Board&)。检查Board&是参数的类型。否则,当您调用构造函数时,您隐式地创建了一个Board的副本,以便构造函数可以按值获取Board。
董事会的HumanPlayer成员变量类型必须是Board&同样。否则,当您设置成员变量时,您将隐式复制原始Board对象中的数据。请记住,当使用引用作为成员变量时,您需要使用constructor initializer list而不是赋值。
答案 3 :(得分:1)
我最好的猜测是你的HumanPlayer
构造函数的声明类似于:
HumanPlayer( Board board, Menu menu, int askForTurn, int otherBoolean );
所以当你用
打电话时HumanPlayer firstPlayer(*board2, *menu, menu->askForFirstTurn(), true);
您实际上firstPlayer
使用board2
的副本进行初始化,而不是对其进行初始化。
如果这确实是你的代码的样子,你需要确保HumanPlayer
的构造函数被声明为接收引用到板(可能还有菜单?)。那看起来像是:
HumanPlayer( Board& board, Menu& menu, int askForTurn, int otherBoolean );