c++ - 在类内部使用具有非静态大小的数组
问题描述
我想使用一个可以在 4d 数组 ( Matrix
) 中为我存储值的类。我想使用SetSize
它来设置Matrix
我的main
函数的大小。
class Value{
public:
int a;
int b;
int c;
int d;
//sets the values
void SetSize(long Sizea, int Sizeb, int Sizec, int Sized){
a = Sizea;
b = Sizeb;
c = Sizec;
d = Sized;
};
double Matrix[a][b][c][d];
void Putavalueinside (double input, long Positiona, long Positionb, long Positionc, long Positiond) {
Matrix[Positiona][Positionb][Positionc][Positiond] = input;
}
};
int main()
{
//makes a class object
Value Test;
//sets the size
Test.SetSize(3, 4, 5, 6);
//gives the Matrix a value
Test.Putavalueinside(10, 0, 0, 0, 0);
//prints it to the consol
std::cout << Test.Matrix[0][0][0][0];
}
但是,该程序无法编译并给我错误:
|15|error: invalid use of non-static data member 'Value::a'|
有谁知道如何解决这个问题?
解决方案
基本上有两种方法可以解决这个问题。如果要保留数组,则需要将维度大小从构造函数参数移动到模板参数。模板参数在编译时是已知的,可用于创建数组。那看起来像
template <size_t a, size_t b, size_t c, size_t d>
class Value{
public:
double Matrix[a][b][c][d]{};
void Putavalueinside (double input, long Positiona, long Positionb, long Positionc, long Positiond) {
Matrix[Positiona][Positionb][Positionc][Positiond] = input;
}
};
int main()
{
//makes a class object
Value<3,4,5,6> Test;
//gives the Matrix a value
Test.Putavalueinside(10, 0, 0, 0, 0);
//prints it to the consol
std::cout << Test.Matrix[0][0][0][0];
}
如果您不知道编译时的大小,那么您将需要进行一些动态内存分配。要处理这个问题,你可以使用 astd::vector
作为矩阵的存储类型,然后你可以使用数学来假装它是一个 4d 结构。那看起来像
class Value{
public:
size_t a;
size_t b;
size_t c;
size_t d;
std::vector<double> Matrix;
Value(size_t a_, size_t b_, size_t c_, size_t d_) : a(a_), b(b_), c(c_), d(d_), Matrix(a_ * b_ * c_ * d_) {}
void Putavalueinside (double input, long Positiona, long Positionb, long Positionc, long Positiond) {
Matrix[Positiona + Positionb * a + Positionc * a * b + Positiond * a * b * c] = input;
}
double Getvalueinside (long Positiona, long Positionb, long Positionc, long Positiond) {
return Matrix[Positiona + Positionb * a + Positionc * a * b + Positiond * a * b * c];
}
};
int main()
{
//makes a class object
Value Test(3,4,5,6);
//gives the Matrix a value
Test.Putavalueinside(10, 0, 0, 0, 0);
//prints it to the consol
std::cout << Test.Getvalueinside(0, 0, 0, 0);
}
可以在这里找到扁平化 n 维数组的公式:4D position from 1D index?
推荐阅读
- amazon-web-services - 部署 cloudformation 模板时指定 S3 存储桶
- python - 从包内的文件夹访问自制包,python
- java - 有没有办法让可执行/可运行的 jar 文件读取可以手动编辑的 yml 文件?
- linux - 如何降低页面分配失败的概率?
- macos - 如何更改终端的提示?
- r - 如何在 rshiny 获取窗口用户名
- html - 减少引导程序中两行之间的间距
- javascript - 如何计算 textarea 中的换行符 - JavaScript | 反应.js
- python - Matplotlib 图表不显示
- php - 使用 MySql 中的日期列基于月份选择行