我一直在开发C++游戏引擎。在更新到Xcode 8.3.1之前,我从未遇到过编译器问题或类似问题!
突然,当我更新默认设置时,似乎更改了默认设置,以使编译器无法处理循环引用。
有谁知道如何将其设置回去,(我尝试降级Xcode,但仍然无法正常工作!)
我的循环引用看起来像这样:
我的“对象”类:
#pragma once
#include "Graphics/2D/Renderer2D.h"
namespace kineticengine {
class Object {
public:
Object();
virtual ~Object() {}
virtual void render(graphics::Renderer2D* renderer) const;
};
}
我的“Renderer2D”类:
#pragma once
#include "Renderable2D.h"
namespace kineticengine {
namespace graphics {
class Renderer2D {
protected:
Renderer2D() {}
public:
virtual void submit(const Renderable2D* renderable) {}; // Error here, "Unknown type name 'Renderable2D', did you mean 'Renderer2D'?"
};
}
}
我的“Renderable2D”类:
#pragma once
#include "Renderer2D.h"
#include "../../Object.h"
namespace kineticengine {
namespace graphics {
class Renderable2D : public Object {
public:
Renderable2D() : Object() {}
virtual ~Renderable2D() {}
void render(Renderer2D* renderer) const override {
renderer->submit(this); // Error here "Cannot initialize parameter of type 'const kineticengine::graphics::Renderer2D *' with an rvalue of type 'const kineticengine::graphics::Renderable2D *'"
}
};
}
}
我所有的错误基本上都是“未知类[x]”的变体,其中x是其他类之一。
任何帮助,将不胜感激!
最佳答案
在定义类Renderable2D之前,Renderable2D.h包含Renderer2D.h,因此,当Renderer2D.h引用类Renderable2D时,尚未定义。 lang的行为正确。
打破此循环的一种方法是,如果只打算通过指针或引用来引用一个类,则不包括 header 。然后,您在其中放置该类的前向声明,而不是include指令。这还有加快编译时间的额外好处。