无法使用 dynamic_cast 从 Base 转换为 Derived
Cannot use dynamic_cast to convert from Base to Derived
当我尝试将基础 class 转换为派生 class 时出现错误。
我想访问我放入组件向量中的派生 classes。
//基础和派生
class Component
{
public:
Component();
virtual ~Component();
private:
};
class Material:public Component{...};
//主要
int textureID = gameScene.gameObjects[0].getComponent<Material>()->texture;
//游戏对象
#pragma once
#include <vector>
#include "Component.h"
class GameObject:public Component
{
public:
GameObject();
GameObject(int otherAssetID);
~GameObject();
int assetID;
std::vector<Component> components;
void addComponent(Component otherComponent);
void deleteComponent(Component otherComponent);
template <class T>
T* getComponent() {
for (int i = 0; i < components.size(); i++)
{
if (dynamic_cast<T*>(components[i]) != nullptr)
{
T *test = dynamic_cast<T*>(components[i]);
return test;
}
}
return nullptr;
}
private:
};
std::vector<Component>
不能包含 class 除了 Component
本身以外的对象。如果将 Material
对象添加到矢量,将存储 Material
的 Component
部分。这个问题被称为 object slicing problem。
您可能想要制作一个向量,其中包含指向基本多态性的指针 class。
::std::vector<::std::unique_ptr<Componenet>> components;
也 dynamic_cast
很昂贵,因此您可能只想在存储返回值后调用它:
T * const test = dynamic_cast<T*>(components[i].get());
if(test)
{
return test;
}
当我尝试将基础 class 转换为派生 class 时出现错误。 我想访问我放入组件向量中的派生 classes。
//基础和派生
class Component
{
public:
Component();
virtual ~Component();
private:
};
class Material:public Component{...};
//主要
int textureID = gameScene.gameObjects[0].getComponent<Material>()->texture;
//游戏对象
#pragma once
#include <vector>
#include "Component.h"
class GameObject:public Component
{
public:
GameObject();
GameObject(int otherAssetID);
~GameObject();
int assetID;
std::vector<Component> components;
void addComponent(Component otherComponent);
void deleteComponent(Component otherComponent);
template <class T>
T* getComponent() {
for (int i = 0; i < components.size(); i++)
{
if (dynamic_cast<T*>(components[i]) != nullptr)
{
T *test = dynamic_cast<T*>(components[i]);
return test;
}
}
return nullptr;
}
private:
};
std::vector<Component>
不能包含 class 除了 Component
本身以外的对象。如果将 Material
对象添加到矢量,将存储 Material
的 Component
部分。这个问题被称为 object slicing problem。
您可能想要制作一个向量,其中包含指向基本多态性的指针 class。
::std::vector<::std::unique_ptr<Componenet>> components;
也 dynamic_cast
很昂贵,因此您可能只想在存储返回值后调用它:
T * const test = dynamic_cast<T*>(components[i].get());
if(test)
{
return test;
}