我想编写战舰游戏,但是在OOP方面我遇到了一些麻烦...首先,我得到了Battlefield
类
class Battlefield
{
private:
string **array;
public:
Battlefield();
~Battlefield();
void createBattlefield();
void drawBattlefield();
string getArray();
};
构造
Battlefield::Battlefield()
{
array = new string*[12];
for (int i = 0; i < 12; i++){
array[i] = new string[12];
}
}
的getArray()
string Battlefield::getArray()
{
return **array;
}
第二课是Game
,到目前为止我只有一种方法shoot()
void Game::shoot(string **array)
{
char row;
int column;
cout << endl << "Row (A, B, ... , J): ";
do{
cin >> row;
if (islower(row)) row = toupper(row);
if (row > 'J' || row < 'A'){
cout << "Row out of range!" << endl << "Try again: ";
}
} while (row > 'J' || row < 'A');
cout << "Column (1, 2, ... , 10): ";
do{
cin >> column;
if (column > 10 || column < 1){
cout << "Column out of range!" << endl << "Try again: ";
}
} while (column > 10 || column < 1);
array[(int)(row - 64)][column] = "[.]";
}
哪个基本上只将[。]放在数组[x] [y]中
但是我在main
int main()
{
Battlefield array;
Game game;
array.createBattlefield();
game.shoot(array.getArray());
}
最后一行导致
错误C2664:&#39; void Game :: shoot(std :: string **)&#39; :无法从&#39; std :: string&#39;转换参数1到&#39; std :: string **&#39;
答案 0 :(得分:2)
getArray()
返回一个字符串,i。即 1D字符数组和Game::shoot()
需要 3D字符数组,因此出错。如果我理解你并想要返回2D战场,就像在Battleship game中一样,你必须创建char**
或vector<vector<char>>
或vector<string>
,所有这些都将是2D char数组。string** array
不是2D矩阵,它是3D。 string**
是令人厌恶的,你应该立即删除它,再也不要使用这样的结构。boost
,Qt
或std::unique_pointer
为您管理内存。row
char
和column
的类型为int
?你试着在这里保存16位内存吗?这不值得,而且非常令人困惑。array
那样过于通用的名字,相信我,当你有超过5k行的代码时,很难记住它是哪个数组。利用这个机会使您的代码更具可读性。Game
类应该在其自身内部创建Battlefield
类,如果你假设它可以包含一个Battlefield
的向量,那么Battlefield
可以在游戏中,但通常取决于你。Battlefield
的构造函数中所做的是一段绝对不必要的代码,imo。向量和字符串为您处理它们的大小,您可以将大小约束添加为Battlefield
类的成员,只是为了保持游戏逻辑的正确性,但限制向量仅使用n个元素,当它可能包含任意数量的元素时就像打破它的腿,迫使它跳舞。所以,这是你可以写的一个例子:
class Battlefield
{
private:
vector<string> mField;
public:
Battlefield();
~Battlefield();
void createBattlefield();
void drawBattlefield();
vector<string>& getArray();
};
Battlefield::Battlefield() {}
void Game::shoot(vector<string>& field)
{
int row;
int column;
// your logic goes here
}
int main()
{
Battlefield field;
Game game;
field.createBattlefield();
game.shoot(array.getArray());
}