如何从 C++ 对象中获取类名?

How can I get the class name from a C++ object?(如何从 C++ 对象中获取类名?)
本文介绍了如何从 C++ 对象中获取类名?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

是否也可以获取对象名称?

Is it possible to get the object name too?

#include<cstdio>

class one {
public:
    int no_of_students;
    one() { no_of_students = 0; }
    void new_admission() { no_of_students++; }
};

int main() {
    one A;
    for(int i = 0; i < 99; i++) {
        A.new_admission();
    }
    cout<<"class"<<[classname]<<" "<<[objectname]<<"has "
        <<A.no_of_students<<" students";
}

我可以在哪里获取名字,比如

where I can fetch the names, something like

[classname] = A.classname() = one
[objectname] = A.objectname() = A

C++ 是否提供任何机制来实现这一点?

推荐答案

您可以使用预处理器来显示变量的名称.例如

You can display the name of a variable by using the preprocessor. For instance

#include <iostream>
#define quote(x) #x
class one {};
int main(){
    one A;
    std::cout<<typeid(A).name()<<"	"<< quote(A) <<"
";
    return 0;
}

输出

3one    A

在我的机器上.# 将一个token变成一个字符串,经过预处理后的行是

on my machine. The # changes a token into a string, after preprocessing the line is

std::cout<<typeid(A).name()<<"	"<< "A" <<"
";

当然如果你做类似的事情

Of course if you do something like

void foo(one B){
    std::cout<<typeid(B).name()<<"	"<< quote(B) <<"
";
}
int main(){
    one A;
    foo(A);
    return 0;
}

你会得到

3one B

因为编译器不会跟踪所有变量的名称.

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

在 gcc 中,typeid().name() 的结果是经过修改的类名,以获得 破解版 使用

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

#include <iostream>
#include <cxxabi.h>
#define quote(x) #x
template <typename foo,typename bar> class one{ };
int main(){
    one<int,one<double, int> > A;
    int status;
    char * demangled = abi::__cxa_demangle(typeid(A).name(),0,0,&status);
    std::cout<<demangled<<"	"<< quote(A) <<"
";
    free(demangled);
    return 0;
}

这给了我

one<int, one<double, int> > A

其他编译器可能使用不同的命名方案.

Other compilers may use different naming schemes.

这篇关于如何从 C++ 对象中获取类名?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Bring window to front -gt; raise(),show(),activateWindow() don’t work(把窗户放在前面 -raise(),show(),activateWindow() 不起作用)
How to get a list video capture devices NAMES (web cameras) using Qt (crossplatform)? (C++)(如何使用 Qt(跨平台)获取列表视频捕获设备名称(网络摄像机)?(C++))
How to compile Qt as static(如何将 Qt 编译为静态)
C++ over Qt : Controlling transparency of Labels and Buttons(C++ over Qt:控制标签和按钮的透明度)
How to know when a new USB storage device is connected in Qt?(Qt如何知道新的USB存储设备何时连接?)
What is an event loop in Qt?(Qt 中的事件循环是什么?)