所以,大约一年前我开始学习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
非常感谢任何解决方案和提示。
答案 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
- 通常是文件。)