typeid.name возвращает число перед производным типом класса - PullRequest
0 голосов
/ 26 мая 2018

У меня есть эти классы: (класс Вопрос является абстрактным, остальные получены)

class Question{
};

class QSingleChoice{
};

class QMultipleChoice{
};

etc.

У меня есть vector<Question*>, в котором хранятся несколько типов вопросов.В графическом интерфейсе мне нужно знать, какой тип вопроса я должен показать, поэтому я использую string questionType = typeid(*question).name(), но вместо «QSingleChoice», «QMultipleChoice» и т. Д. Он возвращает «13QSingleChoice», «5QText», «9QOrdering» и т. Д.Что это за цифры?И могу ли я предположить, что они всегда будут одинаковыми или возможно, что при запуске программы на другом компьютере typeid возвращает что-то вроде «19QSingleChoice» или что-то совершенно другое, например «ASDQSingleChoice»?

1 Ответ

0 голосов
/ 26 мая 2018

Имя, возвращаемое 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;
  }
};

В качестве альтернативы вы можете создать и вернуть перечисление вместо имени строки.

Однако сначала убедитесь, что оно вам действительно нужно.Довольно часто необходимость проверять и идентифицировать определенный тип, скрывающийся за абстрактным интерфейсом, указывает на плохой дизайн.Если графический интерфейс является неотъемлемой частью программы, возможно, Question может просто предложить виртуальные функции, такие как virtual void display() const;.В качестве альтернативы, если графический интерфейс в значительной степени является внешним по отношению к вопросам, возможно, более уместным будет использование шаблона посетителя .

...