1

所以我想测试我的对象是药水还是武器。我如何使用 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--;
}
}
4

2 回答 2

1

我认为 typeid 就足够了,这个网站解释了它是如何工作的http://www.cplusplus.com/reference/typeinfo/type_info/?kw=type_info

于 2013-05-28T04:20:07.513 回答
1

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

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

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);
    }
}

根据您的要求,实现工厂功能或类可能更有益。本页描述了工厂模式并提供了示例代码(Java 语言但易于理解)。

于 2013-05-28T04:21:58.977 回答