我有这些类:(类问题是抽象的,其他类是派生的)
class Question{
};
class QSingleChoice{
};
class QMultipleChoice{
};
etc.
我有一个存储多种问题类型的
vector<Question*>
。在 GUI 中,我需要知道我必须显示什么类型的问题,所以我使用的是 string questionType = typeid(*question).name()
,而不是“QSingleChoice”、“QMultipleChoice”等。它返回“13QSingleChoice”、“5QText”、“9QOrdering”等。什么是那些数字?我是否可以假设它们总是相同的,或者当我在不同的计算机上运行程序时,typeid 可能返回类似于“19QSingleChoice”或完全不同的东西,例如“ASDQSingleChoice”? 最佳答案
std::type_info::name
返回的名称是实现定义的,这意味着完全由每个编译器决定它想要如何表示类型的名称。换句话说,这不是您可以依赖的。它对于调试很有用,并且可以用于在程序的同一运行中进行一些比较,但我认为它的用途不止于此:您必须检查编译器的文档以确定它是否提供你需要的保证。
如果需要,最好自己引入此类功能,可能以 virtual const std::string& classId() const;
的形式引入。
它可以这样实现:
class Question {
public:
virtual const std::string& getClassId() const = 0;
};
class QSingleChoice : public Question {
public:
const std::string& getClassId() const override
{
static const std::string name{"SingleChoice"};
return name;
}
};
class QMultipleChoice : public Question {
public:
const std::string& getClassId() const override
{
static const std::string name{"MultipleChoice"};
return name;
}
};
或者,您可以创建并返回枚举而不是字符串名称。
但是,首先要确保您确实需要它。很多时候,需要检查和识别隐藏在抽象接口(interface)后面的特定类型表明设计不佳。如果 GUI 是程序的一个组成部分,也许
Question
可以简单地提供诸如 virtual void display() const;
之类的虚拟功能。或者,如果 GUI 在很大程度上是问题的外部,那么使用 visitor pattern 可能更合适。关于c++ - typeid.name 在派生类类型之前返回一个数字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50544201/