提问人:Ben G 提问时间:5/14/2022 最后编辑:Ben G 更新时间:5/15/2022 访问量:476
错误“非静态成员引用必须相对于特定对象
ERROR "nonstatic member reference must be relative to a specific object
问:
#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]
这是什么意思,我该如何修复这个错误?
答:
1赞
user12002570
5/14/2022
#1
问题是,在标准 C++ 中,数组的大小必须是编译时常量。但是由于是非静态数据成员,因此类内部的表达式实际上等价于表达式。但指针更像是一个运行时构造,表达式不是常量表达式,不能用于指定数组的大小。GRID_SIZE
GRID_SIZE
this->GRID_SIZE
this
this->Grid_SIZE
为了解决这个问题,你可以使数据成员成为a,如下所示:GRID_SIZE
constexpr 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
,或者也有效。类的所有实例中恒定的任何内容。enum
enum 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
上一个:受保护类的继承
评论
constexpr
std::vector
作为您眼前问题的解决方案。