-2

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

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

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

第三个问题: 中main,我调用K.knight了用户指定的维度数组进行初始化,但是没有初始化。如何在main使用该函数时初始化一个数组K.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;
}
4

1 回答 1

1

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

你有几种可能:

  1. 如果我们想一个普通的棋盘,那么由于数组大小是预先知道的,而且不是特别大,所以在类中创建它:

    class Ktour{
        ...
        int tour[8][8];
        ...
    }
    

尽管一些纯粹主义者可能会说你应该只“新”这样的数组。如果它是一个更大的数组,你当然应该这样做。

  1. 一个更直接的语法,比如你正在尝试做的,用于处理未知大小的数组是:

    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;
        };
        ...
    
    }

您可以通过以下方式轻松访问它:

std::cout << tour[i][j];
  1. 上述类型的编码容易出错。为了减少您未来因内存访问错误而发生的冲突,您确实应该使用 STL 容器类(或 Boost 容器类,或者在使用 Qt 时使用 Qt 容器类,如果它们的大小不太受限制 - 但您也可以在 Qt 中使用 STL),因为它们当您访问数组的越界下标时,会在调试中产生错误,而不是覆盖重要的指针等。因此,您可以使用以下内容:

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

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

    }

你访问它

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

(注意:代码中的额外行是 <pre> 和 <code> 标记的一些工件;由于并非我所有的缩进行都被识别为代码,因此必须这样做。)

于 2016-10-31T01:51:41.247 回答