新表达式中的数组大小必须是常量(动态数组)

array size in new-expression must be constant (dynamic array)

本文关键字:数组 常量 动态 表达式      更新时间:2023-10-16

大家好,我正在尝试创建一个基本上是一和零的 3D 矩阵的类。不幸的是,当我尝试在构造函数中动态分配 3D 矩阵时,控制台抛出我:"新表达式中的数组大小必须是恒定的" 我不知道为什么会这样,编译器似乎认为它是一个静态数组。

这是代码

#include <stdlib.h>
#include <iostream>
class map
{
public:
map( int, int, int,std::string);
~map();
private:
int  dx,dy,dz;
std::string generatorName;
bool* matrix3D;
};
map::map(int  x=0,int  y=0,int  z=0,std::string gen="EMPTY")
{
    matrix3D=new bool[x][y][z];
    generatorName=gen;
}
map::~map()
{
     delete matrix3D;
}

使函数模板化并以这种方式传递大小。

template <size_t N, etc>
...
Array [N]

如果您希望程序按原样工作,包括使用 [ ] 访问每个维度,则可以使用 std::vector 执行此操作

#include <vector>
//...
typedef std::vector<bool> boolArray;
typedef std::vector<boolArray> boolArray2D;
typedef std::vector<boolArray2D> boolArray3D;
class mymap
{
    public:
        mymap( int, int, int,std::string);
    private:
        int  dx,dy,dz;
        std::string generatorName;
        boolArray3D matrix3D;
};
mymap::mymap(int  x=0,int  y=0,int  z=0,std::string gen="EMPTY") :
      matrix3D(x, boolArray2D(y, boolArray(z))), generatorName(gen) 
{}

您不需要析构函数,并且使用 [ ] 的现有代码应该可以工作。

请注意,这不如使用一维数组并使用索引来获得某个 x/y/z 组件有效。 但这需要您更改一些现有代码(使用一个[ ]而不是[ ][ ][ ]来访问您的元素)。

所以,我认为 vector 的目的是使数组更易于使用,但我发现模板的"语法"过于复杂和不直观......因此,我尝试创建一个指向其他指针数组的指针数组的指针。这是我的最终结果,唯一困扰我的是析构函数,我真的释放了我分配的所有内存吗?

#include <iostream>
class airMap
{
public:
    airMap( int, int, int,std::string);
    ~airMap();
private:
    int  dx,dy,dz;
    std::string generatorName;
    bool*** matrix3D;

};
//Constructeurs et destructeurs
airMap::airMap(int  x=0,int  y=0,int  z=0,std::string gen="EMPTY")
{
    matrix3D=new bool**[x];
    for (int i=0;i<x;i++)
    {
        matrix3D[i]=new bool*[y];
        for (int j=0;j<y;j++)
        {
            matrix3D[i][j]=new bool[z];
        }
    }
    dx=x;
    dy=y;
    dz=z;
    generatorName=gen;
}
airMap::~airMap()
{
    for(int i=0;i<dx;i++)
    {
        for(int j=0;j<dy;j++)   
        {
            delete[] matrix3D[i][j];
        }
        delete[] matrix3D[i];
    }
    delete[] matrix3D;
}