在运行时获取C++对象名称

jac*_*hab 14 c++ runtime

我可以在运行时获取对象的名称(比如通过RTTI获取对象的类型)吗?我希望对象能够打印其名称.

谢谢.

jpa*_*cek 14

由于C++中的对象没有任何名称,因此无法获取它们.识别对象的唯一方法是它的地址.

否则,您可以实现命名方案(这意味着对象将具有一些char*std::string成员的名称).您可以使用QObject层次结构在Qt中激发自己,QObject层次结构使用类似的方法.


Kei*_*thB 9

这是不可能的.对于on thing,对象没有唯一的名称.

A a;
A& ar = a;  // both a and ar refer to the same object

new A;  // the object created doesn't have a name

A* ap = new A[100];  // either all 100 objects share the same name, or need to 
                     // know that they are part of an array.
Run Code Online (Sandbox Code Playgroud)

最好的办法是在对象构造函数中添加一个字符串参数,并在创建时为其命名.

  • 固定.我的咖啡因流中含有太多血液. (2认同)

Mar*_*ork 5

该语言不允许您访问该信息。
编译代码时,所有命名对象都已转换为相对内存位置。甚至这些位置由于优化而重叠(即一旦一个变量不再使用,它​​的空间就可以被另一个变量使用)。

您需要的信息存储在大多数编译器生成的调试符号中,但这些信息通常从可执行文件的发行版本中删除,因此您不能保证它们存在。

即使调试符号存在,它们都是特定于编译器/平台的,因此您的代码不能在操作系统甚至同一操作系统上的编译器之间移植。如果您确实想学习本课程,您需要阅读并了解您平台的调试器如何工作(除非您已经编写了编译器,这非常重要)。


Tom*_*Tom 5

这可能是特定于 GCC 的:

#include <typeinfo>
#include <iostream>

template <typename T>
void foo(T t)
{
    std::cout << typeid(t).name() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)