![]() |
#52
VanHorn2008-01-14 13:43
45,46楼if426的方式很有启发性,你在45楼的思路,在46楼的代码,完全达到了抛砖引玉的效果,非常感谢。
我详细看了你写的C++代码,你的用意是自定义一个数组类,用这个类的类型来作为函数返回类型。这样就避免了函数返回数组。 在你的类中,并没有申明二维数组,而是用一个一维结构体数组对二维数组进行了转化,这个结构体的成员分别有代表二维数组的行,列,值。在类的对象申明的时候就用构造函数告诉编译器我要的数组大小,然后动态分配数组。这个做法是很有启发性的。如果让我完善这个类,可能我会重载一下你的那些函数,让它们适合float ,double,char。等。。。 总之,你的做法对我很有启发。我相信对很多初学者也很有启发,下面我把你的代码加上我理解的注释,和所有C++初学者共勉之。 /////////////////////////// ///以下为我加了注释的46楼的代码, /////////////////////////// //filename: arr2d.h #ifndef ARR2D_H_ #define ARR2D_H_ #include <iostream> class Arr2D { private: int xSize; int ySize; struct Coor { int x;//用以储存二维数组行数 int y;//用以储存二维数组列数 int v;//用以储存二维数组值。 }; Coor* unit;/////在这里申明一个结构体的指针。之后动态分配结构体数组之后,它用于指向动态分配数组的首地址。 public: Arr2D(); Arr2D(int x_size, int y_size);//重载构造函数。(如果多写几个重载构造函数,可以让这个类适合不同的数据类型) ~Arr2D(); void showValue(int x_at, int y_at)const; int getValue(int x_at, int y_at)const; void setValue(int x_at, int y_at, int v_set_to); }; #endif //filename: arr2d.cpp #include "arr2d.h" Arr2D::Arr2D()//第一个空构造函数,实际上就是分配一个int内存空间。 { xSize = 0; ySize = 0; Coor* temp = new Coor[0]; unit = temp; } Arr2D::Arr2D(int x_size, int y_size)//动态分配一个以x_size为行数,y_size为列数的二维数组 { //这个二维数组将以一维结构体数组的形式存在于计算机内存中。 xSize = x_size; ySize = y_size; int dataSize = xSize * ySize;//算出这个一维结构体数组的大小,大小为二维数组的行数乘以列数。 Coor* temp = new Coor[dataSize];//以二维数组的行数和列数的乘积做为动态分配结构体数组的大小。 for (int i = 0; i < xSize; i++){ for (int j = 0; j < ySize; j++){ int sn = ySize * i + j;//把二维数组行数,列数转换为一维数组行数。 temp[sn].v = 0;//分别给结构体成员附上二维数组的行数,列数,以及二维数组的值(初始化为0)。 temp[sn].x = i; temp[sn].y = j; } } unit = temp;//把这个动态分配的数组的首地址附给类的数据成员 } Arr2D::~Arr2D() { delete [] unit;//对数据成员unit进行销毁。 } void Arr2D::showValue(int x_at, int y_at)const//显示第x_at行,第y_at列的二维数组的值。 { for (int i = 0; i < xSize; i++){ for (int j = 0; j < ySize; j++){ int sn = ySize * i + j; if ( unit[sn].x == x_at && unit[sn].y == y_at){//遍历一维结构体数组,分别对应结构体数组成员值的行数 //和列数,只要对上了, //那么结构体成员的值就是在二维数组中所需的行数和列数所对应的值。 std::cout << "unit[" << unit[sn].x << "," << unit[sn].y << "] = " << unit[sn].v << std::endl; } } } } int Arr2D::getValue(int x_at, int y_at)const//返回二维数组第x_at行,第y_at列的值。 { for (int i = 0; i < xSize; i++){ for (int j = 0; j < ySize; j++){ int sn = ySize * i + j; if ( unit[sn].x == x_at && unit[sn].y == y_at){//意义同上 return unit[sn].v; } } } return 0; } void Arr2D::setValue(int x_at, int y_at, int v_set_to) { for (int i = 0; i < xSize; i++){ for (int j = 0; j < ySize; j++){ int sn = ySize * i + j; if ( unit[sn].x == x_at && unit[sn].y == y_at){ //遍历一维结构体数组,分别对应结构体数组成员值的行数 //和列数,只要对上了, //将所需值附上即可。 unit[sn].v = v_set_to; } } } } //filename: main.cpp //使用下面语句可创建 X_SIZE * Y_SIZE 的二维数组: //Arr2D objName ( X_SIZE, Y_SIZE ); //使用下面成员函数将二维数组的x,y位置赋值为A; //objName.setValue(x,y,A); //使用下面成员函数可返回二维数组x,y处的值 //objName.getValue(x,y); //使用下面成员函数可直接显示二维数组x,y处的值 //objName.showValue(x,y); #include "arr2d.h" int main(int argc, char* argv[]) { int const X_SIZE = 3; int const Y_SIZE = 4; Arr2D test ( X_SIZE, Y_SIZE ); for (int i = 0; i < X_SIZE; i++){ for(int j = 0; j < Y_SIZE; j++){ test.setValue(i,j,100+Y_SIZE*i+j);//将二维数组中第i行第j列的元素值设置为100+Y_SIZE*i+j } } test.setValue(1,1,200); test.setValue(2,2,300); for (int i = 0; i < X_SIZE; i++){ for(int j = 0; j < Y_SIZE; j++){ test.showValue(i,j); } } int test_get = test.getValue(2,2);//用数组类的成员函数来操作数组,方便了很多,可读性也高了很多。 std::cout << "test_get = " << test_get << std::endl; return 0; } [[italic] 本帖最后由 VanHorn 于 2008-1-14 13:53 编辑 [/italic]] |
在C++中,如果我的函数想返回一张表,这张表是二维的。应该怎么返回。如果我想用一个指针指向一个二维数组,这个指针应该怎么定义。
例如
int functionA();//我想使这个函数返回一个二维数组,函数这么申明行么?
void main()
{
int a[10][10]={0},*p,b[10][10];
p=a;//这样申明在visual c++6的编译器中是无法通过的。
//如果我想用一个指针指向这个数组,并操作他,应该怎么办?
b=functionA();//使得A返回一个二维数组,这样做也是在visual c++6的编译器中是无法通过的。正确做法因该是怎样的?
}
int functionA()
{int temp[10][10]={0};
return temp;
}
[[italic] 本帖最后由 VanHorn 于 2008-1-9 11:17 编辑 [/italic]]