0

我在类中有一个变量声明为已知大小的编译时常量:

static const int array[5][5]; // constants initlialised in another place

以及一个虚拟返回它的函数:

virtual const int** getArray() { return array; }

如何使用这种方法获取这个数组,并将其转换为固定大小的数组,而不是基于指针的,所以我可以像使用它一样使用它cout << data[2][2]

无法编译的示例:

const int[5][5] data = object->getArray();
cout << data[2][2]; 

编译但使应用程序崩溃的示例:

const int** data = object->getArray();
cout << data[2][2]; 

注意:一种解决方案是创建typedef arr[5]和声明方法,arr*但我不想为我使用的每个编译时大小创建一个 typedeftypedef arr5[5]; typedef arr10[10]等等。我正在寻找更多类似的东西:

const int(*)[5] data = object->getArray(); // won't compile, example only

假设编译时常量数组加载了动态 DLL 并且已经在内存中,是否可以将此数据用作数组而不分配新内存并从编译时常量填充它?

4

4 回答 4

2
virtual const int** getArray() { return array; }

那是行不通的,也不应该编译;您试图返回指向某些指针的指针,但没有指向的指针,只有一个数组数组。

您可以返回指向这些数组的指针,同时保留类型:

virtual const int (*getArray())[5] { return array; }
const int (*data)[5] = getArray();
cout << data[2][2];

在 C++11 中,将数组包装在 中std::array并返回对它的引用可能会更好,以避免一些讨厌的语法。

于 2013-05-07T08:49:15.187 回答
1

使用std::array

#include <array>

static const std::array<std::array<int, 5>, 5> myarray; // constants initlialised in another place

virtual const std::array<std::array<int, 5>, 5>& getArray() const 
{ 
  return myarray; 
}

如果您没有 C++11 支持,您可以使用std::tr1::arrayboost::array(或推出您自己的固定大小数组类型。)

于 2013-05-07T08:42:46.750 回答
0

这是不可能的。当数组传递给函数或从函数返回时,您会丢失所有大小信息。可以说,数组衰减为指针

于 2013-05-07T08:41:27.180 回答
0

很简单,你就快到了

const int(*)[5] data = reinterpret_cast<int(*)[5]>(object->getArray());
于 2013-05-07T08:49:28.037 回答