C++ |如何制作包含多个不同 类 对象的向量

C++ | How to make a vector which contains multiple objects of different classes

我正在尝试用 C++ 编写我的第一个游戏引擎,这将类似于 Unity 脚本的工作方式。我正在尝试制作一个组件系统。这是我的问题:

我想要一个包含我的组件的向量,因为我可能需要动态添加一些。问题发生的地方是当我想添加我的组件 class 的派生 class 时。这是一个例子:

std::vector<Component*> components;

用这条线我不能这样做(我很想能够做到):

gameObject.GetComponent<TextRenderer>().text [...]

我仍然需要学习很多东西,而且我真的不完全理解这部分代码(我不理解模板,也找不到好的教程)代码,但这是我的 GetComponent 函数:

template<typename T>
inline T* GetComponent()
{
    for (int i = 0; i < components.size(); i++)
        if (typeid(components[i]) == typeid(T))
        {
            std::cout << "Found Component." << std::endl;
            return (T*) &components[i];
        }
}

这个函数不起作用return没什么and/or有转换问题。

我认为 C 风格的转换是未定义的行为。

据我所知,所有组件class(如SpriteRenderer、Rigidbody等)都源自Unity中的Component。所以我们可以使用 dynamic_cast 来提供安全的向下转型。如果转换成功它 returns 一个有效的指针否则 nullptr.

这是我如何实施它的示例。

template<typename T>
inline T* GetComponent()
{
    for (int i = 0; i < components.size(); i++)
    {
        T* downcasted = dynamic_cast<T>(components[i]);
        if (downcasted)
        {
            std::cout << "Found Component." << std::endl;
            return downcasted;
        }
    }
    return nullptr; // Unity's GetComponent returns null when not found
}

另请注意,dynamic_cast 相对较慢,以防万一您真的很在意性能。