因此,我试图学习C ++中的类(我通常编写Python),并且从以下代码中得到了一些奇怪的行为,这些代码将成为Tic Tac Toe动态调整大小的游戏:
#include <iostream>
#include <string>
// Square NxN board, win with N consecutive.
class TicTacToe {
public:
void PrintBoard();
void MakeMove(int p, int l);
void checkMove(int &position);
bool isWinner() const;
void checkPlayer(int &number, char &move);
TicTacToe(int s);
private:
int player;
int location;
int size;
int **board;
};
void TicTacToe::PrintBoard() {
for (int i = 0; i < size; ++i) {
for (int j = 0; j < size; ++j) {
std::cout << board[i][j] << ' ';
}
std::cout << std::endl;
}
}
TicTacToe::TicTacToe(int s) {
size = s;
board = new int * [size];
if (board) {
for(int i = 0; i < size; ++i) {
board[i] = new int [size];
assert(board[i]);
}
}
}
int main(int argc, char **argv) {
TicTacToe game(3);
TicTacToe Game(5);
game.PrintBoard();
Game.PrintBoard();
return 0;
}
代码似乎正常工作,并且正确分配了代表游戏板的2d数组的大小。但是,正在打印的值有些奇怪。我希望有人能解释为什么我得到以下输出:
0 536870912 0
0 536870912 0
0 536870912 0
0 536870912 0 536870912 10
0 536870912 0 536870912 8
0 536870912 0 536870912 6
0 536870912 0 536870912 4
0 536870912 0 536870912 2
我的问题主要是为什么数组打印的奇数索引为“ 536870912”而不是“ 0”,为什么第二个数组的最后一列有10、8、6、4、2?难道我做错了什么?有没有更好的方法来分配电路板尺寸?任何帮助表示赞赏。
答案 0 :(得分:2)
您没有为电路板提供任何值,因此当您打印出这些值时,它们就是垃圾。尝试将所有初始值设置为0。
TicTacToe::TicTacToe(int s) {
size = s;
board = new int * [size];
for(int i = 0; i < size; ++i) {
board[i] = new int [size];
for(int j = 0; j < size; ++j)
board[i][j] = 0;
}
}
偶然地,无需检查new
的返回值,new
从不返回NULL,如果失败则抛出异常。
答案 1 :(得分:0)
欢迎使用StackOverflow。您之所以感到沮丧,是因为您遇到了一个(非常)常见的问题,提出了一段代码墙,几乎没有解释,也没有表明您已经尝试过(或在SO上进行搜索)。这使我们很难提供帮助。
要回答您的第一个问题,C ++与Python不同之处在于,以这种方式分配的原始内存没有 (必须) 已初始化。对于任何值,更不用说零。除非您将其设置为某值,否则它第二秒之前的值将保持不变。显然,这是不可预测的-有时您只是碰巧将内存清零,有时它是完全随机的,有时您遇到了所做的事情。无论如何,它很少有用,所以被称为垃圾。
要回答第二个问题,是的,除非您做的很奇怪,否则我们通常认为这是错误的。
对于第三个问题,std::vector
通常适合这种情况。
说了这么多,似乎您对最终结果不那么感兴趣,而对将事情包扎起来更感兴趣-太棒了!我不知道具体目标是什么,或者您的学习方式是什么,但是从香草C入手可能会更轻松,因为它更简单。 C ++带来了一些(公认有用的)怪异性,这些怪异性往往会偏离学习C ++的主要教育价值,也就是说,使您的手被内存管理弄脏。只是一个想法。