C ++找不到类型定义?

时间:2014-02-20 19:04:12

标签: c++ gcc g++

所以,大约一年前我开始学习C ++,之前我学习了Java C#和VB.NET。 就像现在一样,我认为自己是一个先进的C ++编码器。然而,有一件事我不太了解。链接过程。继承人这个问题。 现在,我正在使用基本的组件系统为游戏开发编写类似XNA的库 - 但是在构建它时我得到编译器错误,C ++假装它不知道特定类型,在这种情况下,GameComponent类不知道ComponentSelector类(反之亦然),尽管它正确包含和键入。我会告诉你我的两个头文件,希望你能帮助我。

ComponentSelector.hpp:

#ifndef COMPONENTSELECTOR_HPP
#define COMPONENTSELECTOR_HPP
#include<sem/System/Types.hpp>
#include<sem/System/GameComponent.hpp>
#include<vector>
namespace sem
{
    class ComponentSelector
    {
    public:
        GameComponent* getComponent1(); //GameComponent does not name a type
        GameComponent* getComponent2(); //GameComponent does not name a type
        GameComponent* getComponent3(); //GameComponent does not name a type
        void addComponent(GameComponent* item); //GameComponent does not name a type
        void removeComponent1();
        void removeComponent2();
        void removeComponent3();
        void clearList();
    private:
        std::vector<GameComponent*> m_Components;
    protected:
    };
}
#endif // COMPONENTSELECTOR_HPP

GameComponent.hpp:

#ifndef GAMECOMPONENT_HPP
#define GAMECOMPONENT_HPP

#include<sem/System/ComponentSelector.hpp>
#include <sem/System/Types.hpp>

namespace sem
{
    class GameComponent
    {
    public:
        virtual void load() = 0;
        virtual void unload() = 0;
        virtual void update() = 0;
        virtual void draw() = 0;

        ComponentSelector* m_Selector; //ComponentSelector does not name a type

        SEMlong getID();
        SEMstring getName();
        SEMstring getType();
    private:
        SEMlong m_ComponentID;
        SEMstring m_ComponentName;
        SEMstring m_ComponentType;
    protected:
    };
}

#endif // GAMECOMPONENT_HPP

非常感谢任何解决方案和提示。

1 个答案:

答案 0 :(得分:1)

您需要在ComponentSelector班级声明中提及班级GameComponent的前瞻声明:

// Remove this: #include<sem/System/ComponentSelector.hpp> 
#include <sem/System/Types.hpp>

namespace sem
{
    class ComponentSelector; // Note the forward declaration added!

    class GameComponent
    {
         // ...
         ComponentSelector* m_Selector; // Compiles now!
         // ...

我建议在ComponentSelector声明标题中执行相同操作,反之亦然。然后包括完整的类声明,你将在哪里使用任何成员(这在编译单元中,即.cpp - 通常是文件。)