Я строю простую компонентную архитектуру и некоторое время боролся с проблемой предварительного объявления
Архитектура компонентов построена, как показано ниже
Класс компонентов:
#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 Renderer
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, что вызывает проблемы, потому что я только заранее объявил Game Object, поэтому у меня нет доступа к этим функциям-членам.
Вещи, которые я пробовал
- Добавление файла GameObject.h в Компонент. cpp file
- Доступ к указателю GameObject напрямую из Компонента средства визуализации Sprite
Ни один из этих решения сработали, поэтому любая помощь, которую я могу получить, будет высоко ценится