Cpp get class name

Как я могу получить имя класса из объекта C ++?

поскольку компилятор не отслеживает все имена переменных.

Как это происходит в gcc, результатом typeid (). Name () является искаженное имя класса, чтобы получить демаркированная версия использование

#include #include #define quote(x) #x template class one< >; int main() < one> A; int status; char * demangled = abi::__cxa_demangle(typeid(A).name(),0,0,&status); std::cout

Другие компиляторы могут использовать разные схемы именования.

Другие решения

// иллюстративный код, предполагающий, что все включает / пространства имен и т. д.

#include #include using namespace std; struct A<>; int main()

Важно помнить, что это
дает реализацию определенных имен.

Насколько я знаю, нет способа получить имя объекта во время выполнения надежно, например, «А» в вашем коде.

#include #include #include using namespace std; struct A< >; struct B< >; map m; int main()< m[&typeid(A)] = "A"; // Registration here m[&typeid(B)] = "B"; // Registration here A a; cout

Вы хотите, чтобы [classname] было ‘one’, а [objectname] было ‘A’?

Если это так, это невозможно. Эти имена являются только абстракциями для программиста и фактически не используются в генерируемом двоичном коде. Вы можете присвоить классу статическую переменную classname, которую вы устанавливаете в ‘one’, и обычную переменную namename объекта, которую вы присваиваете напрямую, через метод или конструктор. Затем вы можете запросить эти методы для имен классов и объектов.

Чтобы получить имя класса без искажений, вы можете использовать FUNC макрос в конструкторе:

Вы можете попробовать использовать «TypeId» .

Это не работает для имени объекта, но вы знаете имя объекта, поэтому вам просто нужно где-то его сохранить. Компилятору не важно, что вы называете объектом.

Однако стоит помнить, что вывод typeid является специфической для компилятора вещью, поэтому даже если он производит то, что вам нужно, на текущей платформе, он может не работать на другой. Это может или не может быть проблемой для вас.

Другое решение состоит в том, чтобы создать какую-то оболочку шаблона, в которой вы сохраняете имя класса. Затем вам нужно использовать частичную специализацию, чтобы она возвращала правильное имя класса для вас. Это имеет преимущество рабочего времени компиляции, но значительно сложнее.

Изменить: Быть более явным

Тогда для каждого класса somethign lik следующее:

Что может быть даже макросом, как показано ниже:

#define DefineClassName( className ) \ \ template<> class ClassName \ < \ public: \ static std::string name() \ < \ return #className; \ >\ >; \ 

Позволяет вам просто сделать

Наконец, чтобы получить имя класса, вы должны сделать следующее:

Edit2: Если продолжить, вам нужно будет поместить этот макрос «DefineClassName» в каждый создаваемый вами класс и определить функцию «classname», которая будет вызывать функцию статического шаблона.

Edit3: И подумать об этом … Очевидно, что поначалу плохо публиковать сообщения утром, так как вы можете просто определить функцию-член «classname ()» следующим образом:

который может быть макроопределен следующим образом:

DefineClassName( className ) \ std::string classname() \

Тогда вы можете просто уронить

в класс, как вы определяете это …

Просто напишите простой шаблон:

template const char* getClassName(T) < return typeid(T).name(); >struct A <> a; void main()

Улучшение для ответа @Chubsdad,

//main.cpp using namespace std; int main() < A a; a.run(); >//A.h class A< public: A()<>; void run(); > //A.cpp #include #include void A::run()

Источник

Читайте также:  Html popup text window

[c++] How can I get the class name from a C++ object?

as the compiler doesn't keep track of all of the variable's names.

As it happens in gcc the result of typeid().name() is the mangled class name, to get the demangled version use

#include #include #define quote(x) #x template class one< >; int main() < one> A; int status; char * demangled = abi::__cxa_demangle(typeid(A).name(),0,0,&status); std::cout

Other compilers may use different naming schemes.

// illustratory code assuming all includes/namespaces etc

#include #include using namespace std; struct A<>; int main()

It is important to remember that this gives an implementation defined names.

As far as I know, there is no way to get the name of the object at run time reliably e.g. 'A' in your code.

#include #include #include using namespace std; struct A< >; struct B< >; map m; int main()< m[&typeid(A)] = "A"; // Registration here m[&typeid(B)] = "B"; // Registration here A a; cout

To get class name without mangling stuff you can use func macro in constructor:

Do you want [classname] to be 'one' and [objectname] to be 'A'?

If so, this is not possible. These names are only abstractions for the programmer, and aren't actually used in the binary code that is generated. You could give the class a static variable classname, which you set to 'one' and a normal variable objectname which you would assign either directly, through a method or the constructor. You can then query these methods for the class and object names.

Just write simple template:

template const char* getClassName(T) < return typeid(T).name(); >struct A <> a; void main()

This doesn't work for "object" name but YOU know the object name so you'll just have to store it somewhere. The Compiler doesn't care what you namned an object.

Its worth bearing in mind, though, that the output of typeid is a compiler specific thing so even if it produces what you are after on the current platform it may not on another. This may or may not be a problem for you.

The other solution is to create some kind of template wrapper that you store the class name in. Then you need to use partial specialisation to get it to return the correct class name for you. This has the advantage of working compile time but is significantly more complex.

Then for each class somethign liek the following:

Which could even be macro'd as follows:

#define DefineClassName( className ) \ \ template<> class ClassName \ < \ public: \ static std::string name() \ < \ return #className; \ >\ >; \ 

Allowing you to, simply, do

Finally to Get the class name you'd do the following:

Edit2: Elaborating further you'd then need to put this "DefineClassName" macro in each class you make and define a "classname" function that would call the static template function.

Edit3: And thinking about it . Its obviously bad posting first thing in the morning as you may as well just define a member function "classname()" as follows:

Читайте также:  Модуль управления компьютером питон

which can be macro'd as follows:

DefineClassName( className ) \ std::string classname() \

Then you can simply just drop

into the class as you define it .

template inline const char* getTypeName() < return typeid(T).name(); >#define DEFINE_TYPE_NAME(type, type_name) \ template<> \ inline const char* getTypeName() < \ return type_name; \ >DEFINE_TYPE_NAME(int, "int") DEFINE_TYPE_NAME(float, "float") DEFINE_TYPE_NAME(double, "double") DEFINE_TYPE_NAME(std::string, "string") DEFINE_TYPE_NAME(bool, "bool") DEFINE_TYPE_NAME(uint32_t, "uint") DEFINE_TYPE_NAME(uint64_t, "uint") // add your custom types' definitions 

An improvement for @Chubsdad answer,

//main.cpp using namespace std; int main() < A a; a.run(); >//A.h class A< public: A()<>; void run(); > //A.cpp #include #include void A::run()

Источник

Функция winrt::get_class_name (C++/WinRT)

Вспомогающая функция, которая получает строку, содержащую полное имя типа класса среда выполнения Windows, представленного объектом заданного проецируемого типа.

Синтаксис

inline winrt::hstring get_class_name(winrt::Windows::Foundation::IInspectable const& object); 

Параметры

object Экземпляр проецируемого типа для класса среда выполнения Windows (любой класс среды выполнения; будь то тип Windows или второй или сторонний).

Возвращаемое значение

Winrt::hstring, содержащий полное имя типа класса среда выполнения Windows, представленного object . Обратите внимание, что возвращается тип класса среда выполнения Windows, а не тип проецируемого типа. В приведенном ниже примере проецируемый тип C++/WinRT — winrt::Windows::Foundation::Uri, но значение, возвращаемое из winrt::get_class_name, — "Windows. Foundation.Uri", который является именем типа класса среды выполнения.

Пример

winrt::Windows::Foundation::Uri contosoUri< L"https://www.contoso.com" >; winrt::hstring name = winrt::get_class_name(contosoUri); assert(name == L"Windows.Foundation.Uri"); 

Требования

Минимальный поддерживаемый пакет SDK: пакет SDK Windows версии 10.0.17134.0 (Windows 10 версии 1803)

Пространство имен: winrt

Заголовок: %WindowsSdkDir%IncludeWindowsTargetPlatformVersion<>\cppwinrt\winrt\base.h (включен по умолчанию)

См. также раздел

Источник

Вывести на экран имя класса

Вывести на экран имя и фамилию 10 раз
здравствуйте, дорогие программисты!помогите пожалуйста решить задачу. вот условие: Написать.

Инициализация шаблонного класса(В конструкторе класса после двоеточия вновь имя класса)
Всем доброго времени суток! Пытаюсь разобраться как работает приведенный мной код. Конкретно.

Вывести на экран из класса
Вдвнный момент изучаю классы.Не могу понять как их заполнять и выводить. Вот пример того,что я.

Вывести на экран фамилию, имя и адрес учеников, у которых нет домашнего телефона
Известны данные о 25-ти учениках класса: фамилия, имя, отчество, адрес и домашний телефон, если он.

Лучший ответ

Сообщение было отмечено как решение

Решение

class HelloWorld { public: string s; void view(){ cout  "HelloWorld"  endl; };

Эксперт С++

bobromet, А зачем это может понадобиться? Есть такая вещь как typeid(Ob).name(); Но выведет не все имя, а сокращенный тип для этого класса.
Для использования надо подключить: #include
Ob - объект класса.

Эксперт С++

Лучший ответ

Сообщение было отмечено как решение

Решение

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#include #include #include templateclass T> class Named { public: std::string getName() { return typeid(T).name(); } }; class Foo : public NamedFoo> { }; int main() { std::cout  ().getName()  ::endl; return 0; }

пишешь программу и не знаешь имье класса?

Добавлено через 59 секунд

ЦитатаСообщение от CyBOSSeR Посмотреть сообщение

Эксперт С++

nikkka, Почитай про RTTI. Определение типа во время выполнения(Информация о типе на этапе выполнения).

CyBOSSeR, а есть разница в наличии метода для класса? Или это идентично вашему коду?

1 2 3 4 5 6 7 8 9 10 11 12 13 14
#include #include #include templateclass T> class Named { }; class Base : public NamedBase> { }; int main() { Base b; std::cout  <typeid(b).name()  ::endl; return 0; }
#include #include #include class Base { }; int main() { Base b; std::cout  typeid(b).name()  std::endl; return 0; }

ЦитатаСообщение от bobromet Посмотреть сообщение

Эксперт С++

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#include #include #include class Class { public: std::string getName() { return typeid(*this).name(); } }; int main() { std::cout  Class().getName()  std::endl; return 0; }

Эксперт С++

#include #include class Base { }; int main() { std::cout  typeid(Base).name()  std::endl; return 0; }

Парни, отлично! Жму 5
Помню что в шарпе так делал, иногда когда куча классов с "говорящими" именами проще вывести имя класса чем каждый раз новую строчку писать .)

Эксперт С++

fasked, попробуй пронаследоватся от Class и вызови метод getName.
Хотя если метод сделать виртуальным все будет ок.

Но если метод мы сделаем виртуальным, у подклассов появится возможность его переопределить, это не есть хорошо, тем более, что реализация данного методв должна быть одинакова во всех подклассах. Кроме того, делая метод виртуальным, мы получаем еще и указатель на таблицу виртуальных функций в каждом объекте.

Эксперт С++

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
#include #include #define methodName(className, method) className ## method #define defClass(className) \ class className \  < \public: \ static void methodName(className, _getName)() \  < \ std::cout  > \ private : #define endClass >; defClass(foo) endClass defClass(bar) endClass defClass(fooBar) endClass int main() { foo::foo_getName(); bar::bar_getName(); fooBar::fooBar_getName(); return EXIT_SUCCESS; }

C помощью макросов генерируется строка (имя класса) и имя метода, который будет возвращать эту строку. Только вот я даже и не знаю, кому такое чудо может понадобиться.

Эксперт JavaЭксперт С++

Эксперт С++

ЦитатаСообщение от M128K145 Посмотреть сообщение

Эксперт JavaЭксперт С++

Nameless One, рефлексия позволяет получить всю информацию о классе, зная только его имя, можно изменять этот класс, копировать его, сериализовать.
http://ru.wikipedia.org/wiki/%. %B8%D0%B5)

Ребят ну подскажите,как же все таки можно вывести имя объекта класса? Суть в том,что написал лабораторную, в самой лабе есть задание,чтоб на экран выводилось сообщение конструктора и деструктора,и показывало к кому объекту они применяются. Так то я конечно написал, все выводится,но вместо имени я так понимаю что выводится просто адрес объекта,а не его имя.Использовал просто указатель this при выводе. Попытался сделать как выше тут описано через библиотеку typeinfo,все равно не то,выводится не имя объекта,а имя класса . Так то преподаватель думаю ничего не скажет (ибо в самом задании написано,использовать указатель this), просто самому интересно,возможно ли все же как-то сделать,чтоб выводилось именно имя созданного объекта,а не его адрес,как работает через указатель this?

System16v, в С++ нету стандартных средств, которые позволяли бы вывести имя объекта или класса. Дело в том, что имена типов и объектов известны только компилятору. Когда программа уже выполняется, эту информацию получить сложно (не обращаясь к исходникам). Всё-таки С++ компилируется в машинный код, а в машинном коде такой информации нету — только сплошные адреса.

Добавлено через 1 минуту
Вы могли попытаться как-нибудь подключится из программы к исходному коду с помощью отладчика. Но только я не знаю как это сделать

Источник

Оцените статью