[英]C++ 2d “dynamic” array in a class?
因此,我尝试学习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不同,C ++ 不 (以这种方式) 初始化以这种方式分配的原始内存。 对于任何值,更不用说零。 除非您将其设置为某值,否则它第二秒之前的值将保持不变。 显然,这是不可预测的-有时您只是碰巧将内存清零,有时它是完全随机的,有时您遇到了所做的事情。 无论如何,它很少有用,因此被称为垃圾。
要回答您的第二个问题,是的,除非您做的很奇怪,否则我们通常认为这是错误的。
对于第三个问题,这种情况通常首选std::vector
。
话虽这么说,您似乎对最终结果的兴趣不大,而对事物的束缚更多了-太棒了! 我不知道具体目标是什么,或者您的学习方式是什么,但是从香草C入手可能会更轻松,因为它更简单。 C ++带来了一些(公认有用的)怪异性,这些怪异性往往会偏离学习C ++的主要教育价值,也就是说,使您的手被内存管理弄脏。 只是一个想法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.