如何将类中的指针设置为外部静态数据结构?
struct Str {
double **matr; // which type should matr be?
int nx, ny;
template<size_t rows, size_t cols>
void Init(double(&m)[rows][cols], int sx, int sy) {
matr = m; // <-- error
nx = sx; ny = sy;
}
};
...
static double M[3][5] = { { 0.0, 1.0, 2.0, 3.0, 4.0 },
{ 0.1, 1.1, 2.1, 3.1, 4.1 },
{ 0.2, 1.2, 2.2, 3.2, 4.2 } };
Str s;
s.Init(M, 3, 5);
使用此代码,我得到以下编译时错误消息(Visual C ++ 2008/2012):
1&GT;错误C2440:&#39; =&#39; :无法转换为&#39; double [3] [5]&#39;到&#39;加倍**&#39;
1 GT;指向的类型是无关的;转换需要reinterpret_cast,C风格的演员或函数式演员
1 GT;参见函数模板实例化&lt; void S :: Init4&lt; 3,5&gt;(double(&amp;)[3] [5],int,int)&#39;正在编制
答案 0 :(得分:1)
问题是double
的2D数组不是指针数组,它只是指向2D数组的第一个元素的单个指针,该数组由几个连续的双行表示。存储器中。
由于您的struct
包含字段nx
/ ny
,您只需将数组转换为简单指针,然后使用nx
/ ny
即可访问它,即:
struct Str {
double *matr;
int nx, ny;
void Init(double* m, int sx, int sy) {
matr = m;
nx = sx; ny = sy;
}
};
static double M[3][5] = { { 0.0, 1.0, 2.0, 3.0, 4.0 },
{ 0.1, 1.1, 2.1, 3.1, 4.1 },
{ 0.2, 1.2, 2.2, 3.2, 4.2 } };
int main() {
Str s;
s.Init(M[0], 3, 5);
return 0;
}
然后,您必须使用nx
/ ny
来访问数组,例如这是一个可以添加到打印数组的struct Str
的函数:
#include <iostream>
void print() {
for (int i = 0; i < nx; i++) {
for (int j = 0; j < ny; j++) {
std::cout << matr[i*ny+j] << " ";
}
std::cout << std::endl;
}
}
另一个(可以说是更好的)解决方案是将模板参数添加到替换struct Str
/ nx
的{{1}},然后ny
成员可以具有包含尺寸。
答案 1 :(得分:1)
所以,你想要一个指向2D数组的指针。 Str
必须是模板,因为它的成员matr
的类型取决于该数组的维度。
template<int rows, int cols>
struct Str {
double (*matr)[rows][cols];
void Init(double(&m)[rows][cols]) {
matr = &m;
}
};
Str<3, 5> s;
s.Init(M);