大家好我正在尝试创建一个基本上是1和0的3D矩阵的类。不幸的是,当我尝试在构造函数中动态分配3D矩阵时,控制台抛出了我: “new-expression中的数组大小必须是常量”我不知道为什么会发生这种情况,compilator似乎认为它是一个静态数组。
这是代码
#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;
}
答案 0 :(得分:0)
使函数模板化并以相反的方式传递大小。
template <size_t N, etc>
...
Array [N]
答案 1 :(得分:0)
如果您希望您的程序按原样运行,包括使用[ ]
访问每个维度,则可以使用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组件那样高效。但这需要您更改部分现有代码(使用一个[ ]
代替[ ][ ][ ]
来访问您的元素。)
答案 2 :(得分:-1)
所以,我假设vector的目的是让数组更容易使用,但我找到了模板&#34;语法&#34;过于复杂和不直观......所以相反,我试图制作一个指向其他指针数组的指针数组的指针。 这是我的最终结果,唯一困扰我的是析构函数,我是否真的释放了我分配的所有记忆?
#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;
}