C++类中的二维"dynamic"数组?



所以我正在尝试学习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。

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,如果失败,它会抛出异常。

欢迎来到 StackOverflow。你被否决了,因为你遇到了一个(非常(常见的问题,提出了一堵代码墙,几乎没有解释,也没有表明你已经尝试过(或在SO上搜索过(。这使我们更难提供帮助。

为了回答你的第一个问题,C++与Python不同,以这种方式分配的原始内存不是(必然(初始化的。到任何值,更不用说零了。无论它一秒钟前具有什么值,除非您将其设置为某些值,否则都将保留。显然,这是非常不可预测的 - 有时你只是碰巧得到零内存,有时它是完全随机的,有时你会遇到你所做的。无论如何,它很少有用,所以它被称为垃圾。

回答你的第二个问题,是的,我们通常认为这是错误的,除非你做了一些非常奇怪的事情。

对于你的第三个问题,std::vector通常适用于这种类型的场景。

综上所述,您似乎对最终结果不那么感兴趣,而对围绕事物的头脑更感兴趣 - 太好了!我不知道具体目标是什么,也不知道你的学习风格是什么,但你可能更容易从原版C开始,因为它更简单。C++增加了一堆(公认有用的(怪异之处,往往会分散学习C++的主要教育价值,即弄脏你的记忆管理。只是一个想法。

最新更新