我想使用一个可以在 4d 数组 ( ) 内存储值的类Matrix。我想使用它来设置我的函数SetSize的大小。Matrixmain
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];
}
Run Code Online (Sandbox Code Playgroud)
但是,该程序无法编译并给出错误:
|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];
}
Run Code Online (Sandbox Code Playgroud)
如果您不知道编译时的大小是多少,那么您将需要进行一些动态内存分配。为了处理这个问题,你可以使用 astd::vector作为矩阵的存储类型,然后你可以使用 math 来假装它是一个 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);
}
Run Code Online (Sandbox Code Playgroud)
展平 n 维数组的公式可以在这里找到:1D 索引的 4D 位置?
| 归档时间: |
|
| 查看次数: |
1667 次 |
| 最近记录: |