在 C++ class 中初始化用户定义的数组?
Initialization of user-defined array in C++ class?
我正在研究骑士的巡回赛问题,想定义一个 class,但我在初始化用户定义的数组时遇到了问题。所以用户从命令行输入 argvs
是棋盘长度 mX 和 nY;和起始位置(x,y)。所以基本上,我如何初始化用户定义的数组?
第一个问题:在public
部分,声明int ** tour
是否正确?
第二个问题:如何在同一个class下面的函数中引用数组tour
?
第三个问题:在main
中调用K.knight
初始化了一个用户指定维度的数组,但是没有初始化。如何使用函数 K.knigt()
初始化 main
中的数组,并能够在以下函数 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;
}
是的,在ctor中初始化似乎更合乎逻辑。我对此的看法是您正在创建一个 int 指针数组,并且尚未分配指向的 int。
你有几种可能性:
如果我们想一个普通的棋盘,那么由于数组大小是预先知道的,而且不是特别大,就在class:
class Ktour{
...
int tour[8][8];
...
}
尽管一些纯粹主义者可能会说您应该只 "new" 这样的数组。如果它是一个更大的数组,你当然应该这样做。
处理未知大小的数组的更直接的语法是:
class Ktour{
...
int **tour=0;
<pre><code> 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];
以上这种编码方式容易出错。为了减少你未来与内存访问错误的冲突,你真的应该使用 STL 容器 classes(或者 Boost 容器,或者在使用 Qt 时使用 Qt 容器,如果它们的大小不是太有限的话 - 但你可以在 Qt 中使用 STL也),因为当您访问数组的越界下标时,它们会在调试中产生错误,而不是,例如覆盖重要的指针等。因此,您可以使用类似的东西:
class快游{
...
std::vector < std::vector<int> > 游览;</p>
<pre><code>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];
(注意:代码中的额外行是
和 标记的产物;并非我所有的缩进行都被识别为代码。)
我正在研究骑士的巡回赛问题,想定义一个 class,但我在初始化用户定义的数组时遇到了问题。所以用户从命令行输入 argvs
是棋盘长度 mX 和 nY;和起始位置(x,y)。所以基本上,我如何初始化用户定义的数组?
第一个问题:在public
部分,声明int ** tour
是否正确?
第二个问题:如何在同一个class下面的函数中引用数组tour
?
第三个问题:在main
中调用K.knight
初始化了一个用户指定维度的数组,但是没有初始化。如何使用函数 K.knigt()
初始化 main
中的数组,并能够在以下函数 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;
}
是的,在ctor中初始化似乎更合乎逻辑。我对此的看法是您正在创建一个 int 指针数组,并且尚未分配指向的 int。
你有几种可能性:
如果我们想一个普通的棋盘,那么由于数组大小是预先知道的,而且不是特别大,就在class:
class Ktour{ ... int tour[8][8]; ... }
尽管一些纯粹主义者可能会说您应该只 "new" 这样的数组。如果它是一个更大的数组,你当然应该这样做。
处理未知大小的数组的更直接的语法是:
}class Ktour{ ... int **tour=0; <pre><code> 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];
以上这种编码方式容易出错。为了减少你未来与内存访问错误的冲突,你真的应该使用 STL 容器 classes(或者 Boost 容器,或者在使用 Qt 时使用 Qt 容器,如果它们的大小不是太有限的话 - 但你可以在 Qt 中使用 STL也),因为当您访问数组的越界下标时,它们会在调试中产生错误,而不是,例如覆盖重要的指针等。因此,您可以使用类似的东西:
class快游{ ... std::vector < std::vector<int> > 游览;</p> <pre><code>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];
(注意:代码中的额外行是
和 标记的产物;并非我所有的缩进行都被识别为代码。)