2011-09-17 298 views
2

我遇到了一个小问题,我想让两个不同的类能够共享并更改另一个类对象。C++在对象之间共享变量。

我有一个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);应该只是在板类数组来设置的值零。它是这样做的。如果我要从FirstPlayer类的代码中显示板,它将显示更改。但是当我打电话给board2->showBoard()就好像没有什么改变。它仍然是原来不变的董事会。我真正想要发生的事情是让我的firstPlayer和secondPlayer类在一个共享板对象上工作。我只是不确定如何正确地实现这一点。

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

+0

'HumanPlayer firstPlayer(* board2,*菜单,菜单 - > askForFirstTurn(),TRUE);'是不确定的行为。 – Marlon

+0

@Marlon:这是怎么回事?我看起来很好。 –

+0

您发布的代码对我来说确实很好。它应该完成你所描述的。所以问题可能是如何实现removeFromPit()。或者,也许你如何在HumanPlayer类中存储板参考。 – tp1

回答

3

的声明听起来好像要复制的董事会对象,而不是通过引用传递的。您的播放器类的构造函数应该是这样的:

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

protected: 
    Board& the_board_; // REFERENCE to Board 
}; 

如果您在任何地方缺少&运营商(无论是在构造函数签名或对类的成员变量),那么你将会使董事会的副本会在你的班级中使用。

1

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

您的值传递第一个参数。 删除*并将其添加到firstPlayer功能

+0

这可以通过指针传递板,而不是通过引用。如果接受它的类的构造函数是正确编写的,那么通过引用传递就可以。 – Chad

+0

通过指针传递参数有什么不对?无论什么类的构造函数都能正常工 –

1

您可能没有使用参考。有两件事情来检查:

  1. HumanPlayer的构造函数必须以板作为参考(局&)。检查板&是参数的类型。否则,当你调用构造函数时,你隐含地制作了一个委员会副本,这样构造函数可以按照价值获得委员会。

  2. 该板的HumanPlayer成员变量的类型也必须是Board &。否则,当您设置成员变量时,您隐式地从原始Board对象复制数据。请记住,使用引用作为成员变量时,您需要使用constructor initializer list而不是赋值。

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);