我是C 的新手,所以请原谅我的无知和无能。
我正在尝试创建一个名为Planet的类。每个星球都有一个宽度和高度(由于我不是一个完整的受虐狂,它们被存储为矩形(。不同的行星具有不同的宽度和高度。
因此,类需要成员变量来存储这些值。它还需要许多阵列来存储地形信息等。这些阵列的大小应由宽度和高度变量的值确定。因此每个对象都会具有不同尺寸的数组。我的问题是:如何在类中声明这些数组?
尝试使用成员变量声明数组根本不起作用:
class planet
{
public:
planet(); // constructor
~planet(); // destructor
// other public functions go here
private:
int width; // width of global map
int height; // height of global map
int terrainmap [width][height];
};
这会导致错误"非静态数据成员高度的使用无效",这显然不知道该数组应该有多大。如果我使它们成为静态变量,这也适用。
我尝试使用向量进行操作,因为它们更灵活:
vector<int> terrainmap[width][height];
但我遇到的错误完全相同。
我想我只能初始化宽度/高度可能最大值的数组或向量,但是如果此类中的某些对象具有较小的值并且不会使用整个数组,那似乎很浪费。有一个优雅的解决方案吗?
您最好使用std::vector
。为了表示2-DIM数组,您可以使用向量的向量,因此您在下面看到的声明。您甚至可以保留必要的空间,但必须在构造函数中完成。
class planet
{
public:
planet(int width, int height): width(width), height(height) {
terrainmap.reserve(width);
for(int i=0; i<width; ++i) {
terrainmap[i].reserve(height);
}
}
~planet() = default; // destructor
// other public functions go here
private:
int width; // width of global map
int height; // height of global map
std::vector< std::vector<int> > terrainmap;
};
当然,预订不是严格必要的,但是如果对象很大并且您不断将新对象推入地形图,则保留将为您节省一些内存的重新分配。