gpt4 book ai didi

c++ - 如何使用typeid检查您的对象是哪个派生类?

转载 作者:行者123 更新时间:2023-11-30 04:17:53 27 4
gpt4 key购买 nike

所以我想测试一下我的对象是药水还是武器。我如何使用 typeid(即或任何与此相关的东西)做到这一点?

然后我想根据这个条件实例化一个对象。我不能只说 T temp,因为那样会实例化一个抽象基类(即我的 Item 类中有一个纯虚函数)。

template <typename T>
void List<T>::Load(std::ifstream & file)
{
//Read the number of elements
file.read(reinterpret_cast<char *>(&mNumberOfNodes), sizeof(int));

//Insert nodes into list

//If object is a potion
//T * temp = new Potion;

//If object is a weapon
//T * temp = new Weapon;

for( int i = 0; i < mNumberOfNodes; i++ )
{
temp->Load(file);
this->PushFront(&temp);
mNumberOfNodes--;
mNumberOfNodes--;
}
}

最佳答案

我不建议使用 typeid 以您计划使用它们的方式识别对象类型。原因是存储在类型信息中的值可以在构建之间改变。如果发生这种情况,在更改程序之前创建的每个数据文件将不再有效。

相反,您应该自己定义一组值,并将它们与程序中的各种对象类型相关联。最简单的方法是在加载文件时使用枚举和 switch/case block 来创建对象。下面的示例展示了如何使用这种方法实现加载函数。

enum ObjectType
{
Potion,
Sword,
Condom
};

template <typename T>
void List<T>::Load(std::ifstream & file)
{
//Read the number of elements
file.read(reinterpret_cast<char *>(&mNumberOfNodes), sizeof(int));

//Insert nodes into list

for( int i = 0; i < mNumberOfNodes; i++ )
{
T* obj = NULL;
int nodeType;

file.read(reinterpret_cast<char *>(&nodeType), sizeof(nodeType));
switch(nodeType)
{
case Potion:
obj = new Potion(file);
break;

case Sword:
obj = new Sword(file);
break;

case Condom:
obj = new Trojan(file);
break;

default:
throw std::runtime_error("Invalid object type");
}

PushFront(&obj);
}
}

根据您的要求,实现工厂函数或类可能更有益。 This page描述工厂模式并提供示例代码(使用 Java 但易于理解)。

关于c++ - 如何使用typeid检查您的对象是哪个派生类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16783664/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com