C++找不到类型定义

C++ doesnt find type definitions?

本文关键字:定义 类型 找不到 C++      更新时间:2023-10-16

所以,我大约一年前开始学习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

任何解决方案和提示将不胜感激。

您需要

GameComponent类声明中为类ComponentSelector提供前向声明:

// 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文件)。