gpt4 book ai didi

c++ - typeid.name 返回派生类类型前的数字

转载 作者:太空狗 更新时间:2023-10-29 20:51:20 25 4
gpt4 key购买 nike

我有这些类:(类问题是抽象的,其他类是派生的)

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/

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