【问题标题】:Forward Declaration and Accessing member functions in an inherited class继承类中的前向声明和访问成员函数
【发布时间】: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


【解决方案1】:

问题是 SpriteRenderer.cpp 没有包含 GameObject.h

【讨论】:

    猜你喜欢
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多