错误“非静态成员引用必须相对于特定对象

ERROR "nonstatic member reference must be relative to a specific object

提问人:Ben G 提问时间:5/14/2022 最后编辑:Ben G 更新时间:5/15/2022 访问量:476

问:


#ifndef WORLD_H_
#define WORLD_H_
using namespace std;

class World{
public:
    friend class DoodleBug;
    friend class Ant;
    friend class Organism;
    int GRID_SIZE;
    
    World();   
    ~World();   
    
    void Draw();  
    int global_get_ID(int x, int y);  
    Organism* get_Ptr(int x, int y);  
    void set_Ptr(int x, int y, Organism* newOrg);  
    void TimeStepForward();  
    
protected:
    Organism* grid[GRID_SIZE][GRID_SIZE];
};
#endif

在这个在线的.h文件中,我收到以下错误:错误:非静态成员引用必须相对于特定对象。Organism* grid[GRID_SIZE][GRID_SIZE]

这是什么意思,我该如何修复这个错误?

C++ 编译器错误 成员函数

评论

0赞 Yksisarvinen 5/14/2022
数组的大小必须在编译时已知,您不能为此使用(非)类成员。constexpr
2赞 Paul Sanders 5/14/2022
指针的 2D 数组?世界疯了吗?无论如何,请查看 std::vector 作为您眼前问题的解决方案。
0赞 Vlad Feinstein 5/14/2022
我是唯一一个在发布的代码中看不到“返回”的人吗?
0赞 Ben G 5/14/2022
@VladFeinstein对不起,我没有说,但这是一个头.h文件
0赞 Vlad Feinstein 5/14/2022
是的,但是在您的问题中,您说“在线返回 Organism* grid[GRID_SIZE][GRID_SIZE] 我收到此错误”。“回报”在哪里?

答:

1赞 user12002570 5/14/2022 #1

问题是,在标准 C++ 中,数组的大小必须是编译时常量。但是由于是非静态数据成员,因此类内部的表达式实际上等价于表达式。但指针更像是一个运行时构造,表达式不是常量表达式,不能用于指定数组的大小。GRID_SIZEGRID_SIZEthis->GRID_SIZEthisthis->Grid_SIZE

为了解决这个问题,你可以使数据成员成为a,如下所示:GRID_SIZEconstexpr static

class World{
public:
//--vvvvvvvvvvvvvvvv--------------------------->constexpr static added here
    constexpr static int GRID_SIZE = 10;
       
protected:
    Organism* grid[GRID_SIZE][GRID_SIZE];
};

您甚至可以使用 .static const

工作演示

评论

0赞 Goswin von Brederlow 5/14/2022
static const,或者也有效。类的所有实例中恒定的任何内容。enumenum class
0赞 user12002570 5/14/2022
@GoswinvonBrederlow 是的,我也提到过。此外,我只是展示了一种方法。我更喜欢在这个例子中使用。constexpr
0赞 Goswin von Brederlow 5/14/2022
在这种情况下,您应该更喜欢 C++20 中更强大的,因为它实际上会强制编译器在编译时进行计算。constinit
2赞 user12002570 5/14/2022
@GoswinvonBrederlow我认为在这里使用就足够了,没有必要列出所有的可能性。如果用户理解一个,那么他/她也将能够理解其他的。也就是说,只要用户了解生成错误的原因(如我的回答中所述),就无需添加所有可用选项的列表。consexpr