Получение имени класса c ++ программным путем - PullRequest
54 голосов
/ 22 июня 2009

Мне было интересно, возможно ли в C ++ получить имя класса в строковой форме без необходимости жесткого кодирования его в переменную или метод получения. Мне известно, что эта информация фактически не используется во время выполнения, поэтому она недоступна, но можно ли создать какие-либо макросы для создания этой функциональности?

Редактировать. Может быть полезно отметить, что я на самом деле пытаюсь получить имя производного класса и использую Visual C ++ 2008 Express Edition.

Ответы [ 3 ]

88 голосов
/ 22 июня 2009

Вы можете использовать typeid:

#include <typeinfo>
cout << typeid(obj).name() << endl;

Однако это не рекомендуется, поскольку формат не стандартизирован и может отличаться для разных компиляторов (или даже для разных версий одного и того же компилятора).

35 голосов
/ 16 января 2012

Если вы просто хотите проверить, является ли это определенный класс, то

typeid(obj) == typeid(CSubClass)

всегда будет работать независимо от реализаций.

В противном случае удобным способом является объявление:

virtual const char* classname() { return "CMyClass";}

и реализовать для каждого подкласса.

10 голосов
/ 11 марта 2012

Объект typeid(obj).name() всегда дает тип переменной, как она была объявлена, а не фактический тип (класс) объекта. Если переменная obj назначена экземпляру подкласса класса, для которого было объявлено obj, typeid, к сожалению, этого не раскрывает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...