繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM