使用该类的其他成员变量定义该类的成员变量数组

时间:2019-07-09 16:13:57

标签: c++

我对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];

但是我得到完全相同的错误。

我想我可以用可能的最大宽度/高度值初始化一个数组或向量,但是如果此类中的某些对象的值较小并且因此将不会使用整个数组,这似乎是浪费的。有解决方案吗?

1 个答案:

答案 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;
};

当然,保留并不是严格必要的,但是如果对象很大,并且您不断将新对象推入地形图,保留将为您节省一些内存的重新分配。