在C ++类中初始化用户定义的数组?

时间:2016-10-31 00:02:55

标签: c++ arrays class recursion

我正在研究骑士的旅行问题,并想要定义一个类,但是我在初始化用户定义的数组时遇到了麻烦。因此,命令行argvs的用户输入是棋盘长度mX和nY;和起始位置(x,y)。基本上,我如何初始化用户定义的数组?

第一个问题:在public部分,声明int ** tour是否正确?

第二个问题:如何在同一个类的以下函数中引用数组tour

第三个问题:在main中,我调用了K.knight来初始化用户指定的维度数组,但它尚未初始化。如何使用函数mainK.knigt()中初始化数组,并能够在以下函数K.knightfunc()中使用该数组?

class Ktour{
public:
    int xSize;              //m 
    int ySize;              //n 
    int ** tour;            //array to be initialized
    int solutionsCount;     //tracking solutions
    int position;           //position count, from 0 to m * n -1

// initialize tour matrix
void knight(int M, int N) {

position = 1;
solutionsCount = 0;

xSize = M;
ySize = N;

tour = new int * [xSize];
for (int i = 0; i < xSize; i++) {
    for (int j = 0; j < ySize; j++) {
        tour[i][j] = 0;
        std::cout << tour[i][j] << std::endl;
        }
    }
}
....some other functions defined in between...
....
.... 
};
...
// main
int main(int argc, char *argv[])
{    
    Ktour K;

    //user inputs chessboard length mX and nY; and a starting position(x,y)

    int mX = atoi(argv[1]);
    int nY = atoi(argv[2]);
    int x = atoi(argv[3]);
    int y = atoi(argv[4]);

    //initialization
    K.knight(mX, nY);  

    //run the recursive function;
    K.knightFunc(x,y);

    return 0;
}

1 个答案:

答案 0 :(得分:1)

是的,在ctor中初始化似乎更合乎逻辑。我对此的看法是你正在创建一个int指针数组,并且还没有分配指向的int。

您有几种可能性:

  1. 如果我们想到一个共同的棋盘,那么由于数组大小是事先知道的,并且它不是特别大,所以只需在课堂上创建它:

    ng-disabled="myForm.$invalid"
  2. 虽然有些纯粹主义者可能会说你应该只是&#34;新的&#34;这样的数组。如果它是一个更大的阵列,你当然应该。

    1. 一个更简单的语法,就像你正在尝试做的那样,处理未知大小的数组将是:

      class Ktour{
          ...
          int tour[8][8];
          ...
      }
      
    2. 您可以非常简单地访问它:

      class Ktour{
          ...
          int **tour=0;
      
      
          KTour(int M, int N) {
              tour = new int * [M];
              for (int i=0; i<M; ++i)
                  tour[i] = new int [N];
          };
          ~KTour() {
              for (int i=0; i<M; ++i)
                  delete [] tour[i];
              delete [] tour;
          };
          ...
      
      }
      1. 上述类型的编码容易出错。为了减少你未来因内存访问错误而产生的冲突,你真的应该使用STL容器类(或者使用Qt容器类,或者在使用Qt时使用Qt容器类,如果它们的大小不是太大 - 但你也可以在Qt中使用STL),因为当您访问数组的越界下标时,它们会在调试中产生错误,而不是,例如覆盖重要的指针等。因此,你可以使用类似的东西:

        KTour(int M, int N) { tour = new int * [M]; for (int i=0; i<M; ++i) tour[i] = new int [N]; }; ~KTour() { for (int i=0; i<M; ++i) delete [] tour[i]; delete [] tour; }; ...

        std::cout << tour[i][j];

        class Ktour{ ... std::vector < std::vector<int> > Tour;

      2. 您可以使用

        访问它
        
        
        
        KTour(int M, int N) {
            // tour.resize(M);    // not needed.
            tour.assign(M, std::vector <int> (N, 0));
        };
        ~KTour() {
            // No need to delete
        };
        ...
        

        (注意:代码中的额外行是&lt; pre&gt;和&lt; code&gt;标记的一些工件;必须由于我的所有缩进行都不被识别为代码。)