首页 > 解决方案 > 在类内部使用具有非静态大小的数组

问题描述

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

有谁知道如何解决这个问题?

标签: c++

解决方案


基本上有两种方法可以解决这个问题。如果要保留数组,则需要将维度大小从构造函数参数移动到模板参数。模板参数在编译时是已知的,可用于创建数组。那看起来像

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?


推荐阅读