C++对象或二维数组作为参数
C++ Object or 2-dimensional Array as a Parameter?
在我为学校创建的Tic-Tac-Toe游戏中,我有五个类:game(充当游戏的控制器)、Player(基类)、HumanPlayer和AIPlayer(均源自Player)以及Board。
板包含一个2D阵列和一些用于显示和处理阵列的功能。所有三个玩家类都有一个函数makeAMove(Board &board)
,它将在棋盘上选择一个位置并放置一个X或O。
正如您所看到的,makeAMove
接受一个Board
对象作为参数。然后,函数将决定移动并更改Board对象的Board数组。如果我理解正确,传入的实际对象将被更改,并且不需要返回任何内容。
我的理解正确吗?使用2d数组作为参数会更好吗?
这是我的代码的浓缩版本。
#include <iostream>
#include <memory> // auto_ptr
class Board
{
public:
Board()
{
for (int row = 0; row < 3; row++)
{
for (int column = 0; column < 3; column++)
board[row][column] = ' ';
}
}
void displayBoard()
{
std::cout << "n-------------" << std::endl;
for (int row = 0; row < 3; row++)
{
std::cout << "| " ;
for (int column = 0; column < 3; column++)
std::cout << board[row][column] << " | ";
std::cout << "n-------------" << std::endl;
}
}
/* My thought was to use getBoard to return the array rather than using the
object as a parameter
char getBoard()
{
return board[][3];
}
*/
char getCell(int row, int column)
{
return board[row][column];
}
void setCell(int row, int column, char player)
{
board[row][column] = player;
}
private:
char board[3][3];
};
class Player
{
public:
virtual void makeAMove(Board &board) = 0;
};
class AIPlayer : public Player
{
virtual void makeAMove(Board &board)
{
// do some work ont the board array
}
};
class HumanPlayer : public Player
{
virtual void makeAMove(Board &board)
{
// do some work on the board array
}
};
class Game
{
public:
Game(unsigned int players)
{
if (players == 1)
{
player1.reset (new HumanPlayer());
player2.reset (new AIPlayer());
}
else
{
player1.reset (new HumanPlayer());
player2.reset (new HumanPlayer());
}
}
void playGame()
{
player1->makeAMove(myBoard);
}
private:
std::auto_ptr<Player> player1; // pointer to a Player object (C++11 has more secure unique_ptr)
std::auto_ptr<Player> player2; // pointer to a Player object
Board myBoard;
};
int main()
{
Game myGame(1);
myGame.playGame();
return 0;
}
是的,因为您通过引用传递Board
对象,所以函数中对它的任何更改都将更改实际的Board
对象。我认为传递Board
对象是一个更好的想法,因为最好不要向用户公开游戏的实际实现(在这种情况下是2D数组)。所以作为Board对象传递会提供更多的抽象,这是很好的。
makeAMove
属于board
。玩家对象应该决定移动,然后调用board::makeAMove
进行移动。这样玩家对象就不在乎棋盘的内部表示是什么了
按原样通过引用而不是数组传递对象。玩家在棋盘上所做的任何改动都将持续下去。
CCD_ 10是CCD_ 11的私有成员。它应该只通过值而不是通过引用返回。如果你通过Value将2d数组传递给玩家,他们对棋盘所做的任何更改都不会持续。
您的Player
类需要在makeAMove(Board &board)
函数中访问Board.setCell(int, int)
,为此,它们需要board对象。
然而,你的Players
课程需要阅读黑板。为了行动。getCell(int,int)
函数可能就足够了,但嵌套循环所有单元格也可能很乏味。CCD_ 17对于可能的CCD_ 18函数可能是有用的。
- 将值从二维数组输出到文本文件
- 在二维数组中查找最小值和最大值?
- 移动二维数组中的字符
- 如何正确填充在堆上分配的二维数组?
- 传递二维数组时出现问题
- 具有随机数的二维数组不会更改
- 如何在C++中获取二维数组中最少的一列数?
- 如何使用用户输入变量制作二维数组?
- 如何将二维数组类型字符(字符串)作为函数参数传递?
- 如何在C++中将字符串的动态二维数组作为参数传递
- 从文件中读取的二维数组作为参数
- 如何在函数中将二维数组作为参数传递,并在 C++ 中返回二维数组
- C++对象或二维数组作为参数
- 在C++中使用二维数组作为参数时出错
- 将指向数据的指针作为参数传递给期望二维数组的函数
- 无法使用双指针作为函数参数传递二维数组
- 将字符串的二维数组和向量作为参数传递给函数
- 如何将二维数组指向函数的指针作为参数
- 二维数组参数之间的区别是什么?
- **运算符不能将二维数组作为参数