【发布时间】:2020-03-08 22:15:59
【问题描述】:
我正在构建一个简单的组件架构,并且一直在努力解决前向声明的问题
组件架构如下构建
组件类:
#pragma once
class GameObject;
class Component
{
public:
Component();
virtual ~Component();
virtual void Start();
virtual void Update(float _fDeltaTime);
template<typename T>
T* GetComponent()
{
T* c = m_GameObject->GetComponent<T>();
return c;
}
GameObject& GetGameObject();
void SetGameObject(GameObject& go);
private:
GameObject* m_GameObject;
};
游戏对象类
class GameObject
{
public:
GameObject(std::string name);
~GameObject();
template<typename T>
T* GetComponent()
{
for (auto i : m_vecComponents)
{
T* c = dynamic_cast<T*>(i);
if (c != nullptr)
{
return c;
}
}
return nullptr;
}
void AddComponent(std::string _strComponentName);
void Start();
void Update(float _fDeltatime);
private:
std::string m_Name;
std::vector<Component*> m_vecComponents;
};
示例继承组件,Sprite 渲染器
class SpriteRenderer : public Component
{
public:
SpriteRenderer();
~SpriteRenderer();
void Start() override;
void Update(float _fDeltaTime) override;
void ChangeTexture(bool _bTextured);
void SetColor();
private:
Shader* m_pShader;
Texture* m_pTexture;
int m_iWidth;
int m_iHeight;
unsigned int m_iVAO;
unsigned int m_iVBO;
unsigned int m_iEBO;
std::vector<float> m_vecVertices;
std::vector<unsigned int> m_vecIndices;
// Bools To Control Rendering
bool m_bTexture;
};
这些文件都有一个关联的 cpp 文件
问题是我需要能够从 Sprite Renderer 类中的游戏对象获取组件,这会导致问题,因为我只转发声明的游戏对象,所以我无权访问这些成员函数。
我尝试过的事情
- 将 GameObject.h 文件添加到 Component.cpp 文件中
- 直接从 Sprite Renderer 组件访问 GameObject 指针
这些解决方案都没有奏效,所以我能得到任何帮助将不胜感激
【问题讨论】:
-
您是否也将
GameObject.h包含在SpriteRenderer.cpp中?请添加您遇到的问题。 -
这是问题,非常感谢
-
要调用类的成员函数,该类的完整定义(不仅仅是“前向声明”)需要对编译器可见。因此,解决方案的一部分——如果你关心头文件是自包含的——是在定义
Component类之前,在Component的头文件中添加#include的头文件。
标签: c++ inheritance