我一直在开发C++游戏引擎。在更新到Xcode 8.3.1之前,我从未遇到过编译器问题或类似问题!

突然,当我更新默认设置时,似乎更改了默认设置,以使编译器无法处理循环引用。

有谁知道如何将其设置回去,(我尝试降级Xcode,但仍然无法正常工作!)

我的循环引用看起来像这样:

  • 我的代码
  • 中定义了一个名为“Object”的类
  • “对象”包括另一个名为“Renderer2D”的类
  • “Renderer2D”包括另一个名为“Renderable2D”的类。
  • “Renderable2D”扩展了“Object”

  • 我的“对象”类:
    #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指令。这还有加快编译时间的额外好处。

    10-08 19:26