我对C ++很陌生,所以请原谅我的无知和无能。
我正在尝试创建一个名为Planet的类。每个行星都有一个宽度和高度(它们存储为矩形,因为我不是一个完整的受虐狂)。不同的行星具有不同的宽度和高度。
因此,该类需要成员变量来存储这些值。它还需要许多数组来存储地形信息等。这些数组的大小应由width和height变量的值确定。因此,每个对象将具有不同大小的数组。我的问题是:如何在类中声明这些数组?
尝试使用成员变量声明数组根本行不通:
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];
};
这将导致错误“无效使用非静态数据成员'height'”,这很有意义,因为显然编译器不知道该数组应该有多大。如果我将它们设为静态变量,这也适用。
我尝试使用向量代替,因为它们更灵活:
vector<int> terrainmap[width][height];
但是我得到完全相同的错误。
我想我可以用可能的最大宽度/高度值初始化一个数组或向量,但是如果此类中的某些对象的值较小并且因此将不会使用整个数组,这似乎是浪费的。有解决方案吗?
答案 0 :(得分:0)
最好使用std::vector
。为了表示2维数组,可以使用vector的向量,因此可以在下面看到声明。您甚至可以保留必要的空间,但是必须在构造函数中完成。
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;
};
当然,保留并不是严格必要的,但是如果对象很大,并且您不断将新对象推入地形图,保留将为您节省一些内存的重新分配。