在类内部使用具有非静态大小的数组

2024-03-17

我想使用一个可以在 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];

}

如果您不知道编译时的大小是多少,那么您将需要进行一些动态内存分配。要处理这个问题,您可以使用std::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 维数组的公式:1D 索引的 4D 位置? https://stackoverflow.com/questions/29142417/4d-position-from-1d-index

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在类内部使用具有非静态大小的数组 的相关文章

随机推荐