我正在开发一款Snake游戏,而我在使用C ++中的循环引用时遇到了麻烦。 这是SnakeBody类的标题,代表Snake的任何部分,而不是头部。
#ifndef SNAKEBODY_HPP_
#define SNAKEBODY_HPP_
class SnakeBody {
public:
SnakeBody(SnakeHead *origin, int left, int x, int y);
~SnakeBody() = default;
void move();
void grow(int size);
protected:
SnakeBody *next;
SnakeHead *head;
SnakeGame *game;
int x;
int y;
int growWait;
};
#endif /* !SNAKEBODY_HPP_ */
还有源代码(包含构造函数的部分)。
#include "../include/SnakeHead.hpp"
#include "../include/SnakeGame.hpp"
#include "../include/SnakeBody.hpp"
SnakeBody::SnakeBody(SnakeHead *origin, int left, int x, int y)
{
this->head = origin;
this->game = this->head->getGame();
this->x = x;
this->y = y;
this->growWait = 0;
if (left > 0)
this->next = new SnakeBody(origin, left - 1, x + 1, y);
else
this->next = nullptr;
}
我一直在小心地将每个包含在源代码而不是标题中,以避免未完成的引用和循环。但看起来SnakeHead仍然有一个未定义的引用。
SnakeBody:蛇的任何部分都不是头部。 SnakeHead:蛇头。 SnakeGame:包含董事会的状态,需要参考SnakeHead和SnakeHead,SnakeBody需要SnakeGame的参考来获取有关游戏状态的数据(即:墙壁,食物等...... )。
错误信息是:./ src /。/ include / SnakeBody.hpp:19:9:错误:'SnakeHead'没有命名类型;你是说'SnakeBody'吗? SnakeHead * head;
答案 0 :(得分:1)
添加转发参考。顺便说一句,没有理由使用三个头文件。 没有其他类没有任何用途,所以将它们全部放入一个标题中。命名空间会很好。
#ifndef SNAKEBODY_HPP_
#define SNAKEBODY_HPP_
class SnakeHead; // Here
class SnakeGame; // and here
class SnakeBody {
public:
SnakeBody(SnakeHead *origin, int left, int x, int y);
~SnakeBody() = default;
void move();
void grow(int size);
protected:
SnakeBody *next;
SnakeHead *head;
SnakeGame *game;
int x;
int y;
int growWait;
};
#endif /* !SNAKEBODY_HPP_ */