非静态成员引用必须相对于特定对象c ++

时间:2015-10-30 13:10:55

标签: c++

创建多维数组时,我遇到以下错误:

a non static member reference must be relative to a specific object c++

我的代码:

class Level
{
private:
    int width = 6;
    int height = 6;
    Room rooms[width][height];
public:
    Level();
    ~Level();
};

当替换宽度和高度时,在创建数组时,使用6(int的值)它可以工作。为什么我不能使用具有相同值的int?

我不需要变量大小(否则我应该使用向量),我认为使用一些变量会使其他人在阅读时更具可读性。

在我的构造函数中,我将在for循环中填充数组,如:

Level::Level(int id)
{
    for (int i = 0; i < levelWidth; i++)
    {
        for (int x = 0; x < levelHeight; x++)
        {
          //Do the filling here
        }
    }
}

3 个答案:

答案 0 :(得分:4)

如果您有权访问C ++ 11,则可以使用constexpr

class Level
{
private:
    static constexpr int width = 6;
    static constexpr int height = 6;
    Room rooms[width][height];
public:
    Level();
    ~Level();
};

请注意,这两名成员现在都是静态的。 Constexpr意味着可以在编译时评估该值,因此它不是可变大小的数组。

如果你想要可变大小的数组,你必须使用vector或(不推荐)使用你自己的内存分配策略。

const有效,但constexpr更好。 constexpr表示可以在编译时评估值,即使是更复杂的类型。你甚至可以使它们起作用,比如

static constexpr int width() { return 6; }

更重要的是,您可以使用模板参数中的值。

std::array<std::array<Room, width>, height>

如果可以,我建议你阅读std::array,因为它们提供了原始数组的零开销替代

答案 1 :(得分:3)

这在c ++中是不允许的。您无法创建可变大小的数组。

如果你想要一个可变大小我建议根据宽度和高度在构造函数中分配你的内存,并将空间声明为Room** rooms;

如果你真的需要可变长度,你也可以使用std::vector 在您的情况下,您将拥有:std::vector<std::vector<Room>> rooms

编辑: 如果您不需要可变长度,那么您需要创建widthheight静态成员,或者您可以使用明确为固定大小的数组生成的std :: array。

EDIT2:

为什么你要做的事情不起作用是因为VLA没有在C ++中实现(虽然它们在C中),因为如果你有一个可变的大小,你可以简单地使用std::vector。您可以在该主题上找到一些讨论here

如果您使用clang(参见讨论here),即使它违反标准,您似乎也可以实现。

答案 2 :(得分:1)

如果您需要提供维度长度,则应将其定义为static const或c ++ 11 static contexpr,或者将这些参数作为模板参数传递,如下所示

template<std::size_t Width, std::size_t Height>
class Level
{
private:
    Room rooms[Width][Height];
public:
    Level();
    ~Level();
};

甚至更好地使用std::array

如果尺寸长度不需要,您可以使用std::vector