飘逸的苹果 · 参透甲骨文中的“中国式浪漫”· 8 月前 · |
狂野的皮蛋 · 全网最全——盘点在新冠疫情期间牺牲的医护人员 ...· 1 年前 · |
气宇轩昂的红薯 · 我就是不按套路出牌-百分之七-微信读书· 1 年前 · |
安静的李子 · 奇怪的顾客sana - 百度· 1 年前 · |
重情义的羽毛球 · 驻印度尼西亚大使肖千考察印尼芝拉扎燃煤电站_ ...· 1 年前 · |
如何返回存储在类的
private
字段中的多维数组?
class Myclass {
private:
int myarray[5][5];
public:
int **get_array();
// This does not work:
int **Myclass::get_array() {
return myarray;
}
我得到以下错误:
无法将
int (*)[5][5]
转换为返回
中的
int**
将int改为int,或者尝试使用int?
要返回指向数组成员数组的指针,需要的类型不是
int **
,而是
int (*)[5]
class Myclass {
private:
int myarray[5][5];
public:
int (*get_array())[5];
int (*Myclass::get_array())[5] {
return myarray;
}
我设法使用自动类型推断在C++0x中实现了这个函数。然而,没有它我就不能让它工作。原生C数组在C++中的支持不是很好--它们的语法非常可怕。您应该使用包装器类。
template<typename T, int firstdim, int seconddim> class TwoDimensionalArray {
T data[firstdim][seconddim];
public:
T*& operator[](int index) {
return data[index];
const T*& operator[](int index) const {
return data[index];
class Myclass {
public:
typedef TwoDimensionalArray<int, 5, 5> arraytype;
private:
arraytype myarray;
public:
arraytype& get_array() {
return myarray;
int main(int argc, char **argv) {
Myclass m;
Myclass::arraytype& var = m.get_array();
int& someint = var[0][0];
}
这段代码编译得很好。您可以在Boost (boost::array)中获得预先编写的包装类,它支持整个shebang。
二维数组不会衰减为指向整数指针的指针。它衰减为指向整型数组的指针-也就是说,只有第一维衰减为指针。指针并不指向int指针,当指针递增时,指针会按指针的大小前进,而是指向5个整数的数组。
class Myclass {
private:
int myarray[5][5];
public:
typedef int (*pointer_to_arrays)[5]; //typedefs can make things more readable with such awkward types
pointer_to_arrays get_array() {return myarray;}
int main()
Myclass o;
int (*a)[5] = o.get_array();
Myclass::pointer_to_arrays b = o.get_array();
}
当每个子数组被单独分配时(也就是说,您最初有一个指针数组),就会使用指向指针的指针(
int**
)
int* p[5];
for (int i = 0; i != 5; ++i) {
p[i] = new int[5];
}
这里我们有一个由五个指针组成的数组,每个指针指向一个单独的内存块中的第一项,总共有6个不同的内存块。
在一个二维数组中,你会得到一个连续的内存块:
int arr[5][5]; //a single block of 5 * 5 * sizeof(int) bytes
你应该看到这些东西的内存布局是完全不同的,因此这些东西不能以相同的方式返回和传递。
如何返回隐藏在私有字段中的多维数组?
如果它应该是隐藏的,为什么你要把它放在第一位呢?
无论如何,你不能从函数返回数组,但是你可以返回指向第一个元素的指针。整数的5x5数组的第一个元素是什么?当然是由5个整数组成的数组:
int (*get_grid())[5]
return grid;
}
或者,您可以通过引用返回整个数组:
int (&get_grid())[5][5]
return grid;
}
...welcome to C声明器语法地狱;-)
我可以推荐使用
std::vector<std::vector<int> >
或
boost::multi_array<int, 2>
吗?
您可以返回两种可能的类型来提供对内部数组的访问。旧的C风格将返回
int *[5]
,因为数组很容易衰减为指向第一个元素的指针,该元素的类型为
int[5]
。
int (*foo())[5] {
static int array[5][5] = {};
return array;
}
现在,您还可以返回对内部数组的正确引用,最简单的语法将是通过typedef:
typedef int (&array5x5)[5][5];
array5x5 foo() {
static int array[5][5] = {};
return array;
}
或者,如果没有类型定义函数,就会更加麻烦:
int (&foo())[5][5] {
static int array[5][5] = {};
return array;
}
C++版本的优点是保留了实际类型,这意味着数组的实际大小在调用方是已知的。