C ++中的循环引用

时间:2018-04-06 03:26:11

标签: c++ compilation header

我正在开发一款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;

1 个答案:

答案 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_ */