C ++在对象之间共享变量。

时间:2011-09-17 20:41:44

标签: c++ class

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

我有一个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类在一个共享板对象上工作。我现在还不确定如何正确实现这一点。

谢谢大家的帮助。如果您需要更多信息,请与我们联系。

4 个答案:

答案 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)

您可能没有完全使用引用。有两件事需要检查:

  1. HumanPlayer的构造函数必须将该板作为参考(Board&)。检查Board&是参数的类型。否则,当您调用构造函数时,您隐式地创建了一个Board的副本,以便构造函数可以按值获取Board。

  2. 董事会的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 );