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
相对较慢,以防万一您真的很在意性能。
我正在尝试用 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
相对较慢,以防万一您真的很在意性能。