Поэтому я хочу проверить, является ли мой объект зельем или оружием. Как мне сделать это с помощью 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 для создания объектов при загрузке файла. В приведенном ниже примере показано, как вы можете реализовать свою функцию загрузки, используя этот подход.
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, но легко понятный).
Я думаю, что typeid достаточно, чтобы сделать это, этот сайт объясняет, как это работает http://www.cplusplus.com/reference/typeinfo/type_info/?kw=type_info