在类中的C ++ 2d“动态”数组?

时间:2018-09-08 22:07:31

标签: c++ arrays

因此,我试图学习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?难道我做错了什么?有没有更好的方法来分配电路板尺寸?任何帮助表示赞赏。

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 ++的主要教育价值,也就是说,使您的手被内存管理弄脏。只是一个想法。