编译器说变量不是类的成员,当它是时

zal*_*loo 5 c++ compiler-errors

我在网格的默认构造函数的前两行收到编译器错误“错误:墙不是网格的成员”。我不知道为什么它这么说,因为我在头文件中定义了墙和网格!我也尝试过使用 this->wall、Grid::wall 和初始化列表。这是代码:

\n\n
Grid::Grid() {\n    this->wall = Species("wall");\n    this->empty = Species("empty");\n    Grid::turn_number = 0;\n    int a,b;\n    for(a= 0; a < 100; a++)\n        for(b = 0; b< 100; b++) {\n            Creature empty_creature = Creature(Grid::empty,a,b,NORTH,this);\n            ((Grid::map)[a][b]) = empty_creature;\n        }\n    Grid::width = 0;\n    Grid::height = 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我更改默认构造函数以使用初始化列表时,我收到相同的错误:

\n\n
Grid::Grid()\n: width(0), height(0), turn_number(0), wall("wall"), empty("empty"){\n    int a,b;\n    for(a= 0; a < 100; a++)\n        for(b = 0; b< 100; b++) {\n            Creature empty_creature = Creature(Grid::empty,a,b,NORTH,this);\n            ((Grid::map)[a][b]) = empty_creature;\n        }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

在头文件中:

\n\n
class Grid {\nprotected:\n    Creature map[100][100];\n    int width,height;\n    int turn_number;\n    Species empty;\n    Species wall;\npublic:\n    Grid();\n    Grid(int _width, int _height);\n    void addCreature(Species &_species, int x, int y, Direction orientation);\n    void addWall(int x, int y);\n    void takeTurn();\n    void infect(int x, int y, Direction orientation, Species &_species);\n    void hop(int x, int y, Direction orientation);\n    bool ifWall(int x, int y, Direction orientation);\n    bool ifEnemy(int x, int y, Direction orientation, Species &_species);\n    bool ifEmpty(int x, int y, Direction orientation);\n    void print();\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我的其余编译器错误(在评论中询问)。抱歉,格式错误,我的计算机由于某种原因输出奇怪的字符。

\n\n
Darwin.c++: In constructor \xc3\xa2\xe2\x82\xac\xcb\x9cGrid::Grid()\xc3\xa2\xe2\x82\xac\xe2\x84\xa2:\nDarwin.c++:8:40: error: class \xc3\xa2\xe2\x82\xac\xcb\x9cGrid\xc3\xa2\xe2\x82\xac\xe2\x84\xa2 does not have any field named \xc3\xa2\xe2\x82\xac\xcb\x9cwall\xc3\xa2\xe2\x82\xac\xe2\x84\xa2\nDarwin.c++:8:54: error: class \xc3\xa2\xe2\x82\xac\xcb\x9cGrid\xc3\xa2\xe2\x82\xac\xe2\x84\xa2 does not have any field named \xc3\xa2\xe2\x82\xac\xcb\x9cempty\xc3\xa2\xe2\x82\xac\xe2\x84\xa2\nDarwin.c++:12:39: error: \xc3\xa2\xe2\x82\xac\xcb\x9cempty\xc3\xa2\xe2\x82\xac\xe2\x84\xa2 is not a member of \xc3\xa2\xe2\x82\xac\xcb\x9cGrid\xc3\xa2\xe2\x82\xac\xe2\x84\xa2\nDarwin.c++: In constructor \xc3\xa2\xe2\x82\xac\xcb\x9cGrid::Grid(int, int)\xc3\xa2\xe2\x82\xac\xe2\x84\xa2:\nDarwin.c++:17:86: error: class \xc3\xa2\xe2\x82\xac\xcb\x9cGrid\xc3\xa2\xe2\x82\xac\xe2\x84\xa2 does not have any field named \xc3\xa2\xe2\x82\xac\xcb\x9cwall\xc3\xa2\xe2\x82\xac\xe2\x84\xa2\nDarwin.c++:17:99: error: class \xc3\xa2\xe2\x82\xac\xcb\x9cGrid\xc3\xa2\xe2\x82\xac\xe2\x84\xa2 does not have any field named \xc3\xa2\xe2\x82\xac\xcb\x9cempty\xc3\xa2\xe2\x82\xac\xe2\x84\xa2\nDarwin.c++:21:39: error: \xc3\xa2\xe2\x82\xac\xcb\x9cempty\xc3\xa2\xe2\x82\xac\xe2\x84\xa2 is not a member of \xc3\xa2\xe2\x82\xac\xcb\x9cGrid\xc3\xa2\xe2\x82\xac\xe2\x84\xa2\nDarwin.c++: In member function \xc3\xa2\xe2\x82\xac\xcb\x9cvoid Grid::addWall(int, int)\xc3\xa2\xe2\x82\xac\xe2\x84\xa2:\nDarwin.c++:32:31: error: \xc3\xa2\xe2\x82\xac\xcb\x9cwall\xc3\xa2\xe2\x82\xac\xe2\x84\xa2 is not a member of \xc3\xa2\xe2\x82\xac\xcb\x9cGrid\xc3\xa2\xe2\x82\xac\xe2\x84\xa2\nDarwin.h:35:10: error: field \xc3\xa2\xe2\x82\xac\xcb\x9cempty\xc3\xa2\xe2\x82\xac\xe2\x84\xa2 has incomplete type\nDarwin.h:36:10: error: field \xc3\xa2\xe2\x82\xac\xcb\x9cwall\xc3\xa2\xe2\x82\xac\xe2\x84\xa2 has incomplete type\nIn file included from RunDarwin.c++:33:0:\nDarwin.h:35:10: error: field \xc3\xa2\xe2\x82\xac\xcb\x9cempty\xc3\xa2\xe2\x82\xac\xe2\x84\xa2 has incomplete type\nDarwin.h:36:10: error: field \xc3\xa2\xe2\x82\xac\xcb\x9cwall\xc3\xa2\xe2\x82\xac\xe2\x84\xa2 has incomplete type\n
Run Code Online (Sandbox Code Playgroud)\n

Ben*_*igt 4

“具有不完整的类型”意味着您尚未向编译器提供Species. 如果没有定义,最多只能有指向数据的指针,因为编译器不知道要保留多少空间。因此它会给出一个错误,然后忽略该行并尝试理解程序的其余部分。当然,由于该行被忽略,稍后尝试使用它将会失败。

请注意,您的编辑器已按文件名对错误进行排序,而不是向您显示它们实际发生的顺序。以后按顺序看编译器输出。

Species通过在before中添加定义(或 #include),这一切都可以轻松解决class Grid