Прямое объявление и доступ к функциям-членам в унаследованном классе - PullRequest
0 голосов
/ 09 марта 2020

Я строю простую компонентную архитектуру и некоторое время боролся с проблемой предварительного объявления

Архитектура компонентов построена, как показано ниже

Класс компонентов:

#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

Ни один из этих решения сработали, поэтому любая помощь, которую я могу получить, будет высоко ценится

1 Ответ

1 голос
/ 09 марта 2020

Проблема была в том, что SpriteRenderer. cpp не включал GameObject.h

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...