我已经有很长时间没有使用 C++ 了,但是我有一个使用 3 维数据的类,我不知道如何才能让它工作。我需要在构造函数中定义维度的大小。我在标题中试过这个:
class CImage
{
public:
float values[][][];
...
}
在构造函数中:
CImage::CImage(int cols, int rows, int depth)
{
values[cols][rows][depth];
}
但这会返回错误:“将‘值’声明为多维数组必须对除第一个维度之外的所有维度都有边界”。
在构造函数中使用它也不起作用:
values = new float[cols][rows][depth];
我也尝试过使用 vector ,但没有太大的成功。 header :
vector<vector<vector<float> > > values;
构造函数中没有任何内容。没有编译器错误,但是当我尝试设置一个值时:
values[c][r][d] = value;
程序崩溃。
看起来很基础,但我就是想不通......
最佳答案
程序在访问该 vector 时崩溃,因为它是空的,即这些索引处没有元素。
解决此问题的最佳方法是创建一个线性的一维 vector (甚至数组),并使用一对运算符 () 访问它,请参阅 C++FAQ Lite了解详情。或者使用 boost::multi_array .
例如:
#include <vector>
#include <iostream>
class CImage
{
int X, Y, Z;
std::vector<float> values;
public:
CImage(int cols, int rows, int depth)
: X(cols), Y(rows), Z(depth),
values(cols*rows*depth) {}
float operator()(int x, int y, int z) const
{
return values[Z*Y*x + Z*y + z];
// or you lay it out differently in memory
// if you please, transparent to the user:
// return values[x + X*y + X*Y*z];
}
float& operator()(int x, int y, int z)
{
return values[Z*Y*x + Z*y + z];
// likewise, in a different layout
// return values[x + X*y + X*Y*z];
}
};
int main()
{
CImage ci(3,3,3);
ci(2,2,2) = 7.0;
std::cout << ci(2,2,2) << '\n';
}
关于c++ - 如何将 3 维数据用作类属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3717427/