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

时间:2009-01-22 12:40:41

标签: c++ runtime

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

感谢。

8 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:9)

不可能。对于on事物,对象没有唯一的名称。

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.

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

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:3)

这可能是GCC特定的:

#include <typeinfo>
#include <iostream>

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

答案 4 :(得分:2)

C ++并不真正支持反射。然而,一些谷歌搜索产生了几个alternate methods,我怀疑你会发现它们有用。

答案 5 :(得分:1)

如果你的意思是变量的名称,我认为这是不可能的。也许如果您使用GNU Debugger选项进行编译...但即使以这种方式,我也不认为该语言有构造可以做到这一点。

答案 6 :(得分:1)

C ++对象没有'名字'(除非我理解错误的问题)你最好的希望是在你制作它们时命名它们。

class NamedObject
{
  String name;
  NamedObject(String argname)
  { 
    name = argname;
  }
}

NamedObject phil("phil");

答案 7 :(得分:0)

所以,这基本上就是我所做的。这很骇人听闻,但它可以解决问题。我创建了一个利用字符串化的可变宏。不幸的是,为了提供伪默认的ctor,需要一个_dummy参数变得笨拙,因为你不能省略将命名参数与变量参数分开的逗号(我甚至尝试使用gnu cpp,但是不成功 - 可能我没有努力尝试)。

#include <string>

#define MyNamedClass( objname, ... ) MyClass objname(__VA_ARGS__, #objname )

class MyClass
{
public:
   MyClass( void* _dummy=nullptr, const std::string& _name="anonymous") : name( _name ) {}
   MyClass( int i, const std::string& _name="anonymous" ) : name( _name ) {}

private:
   std::string name;
};


int main()
{
   MyClass mc0;
   MyClass mc1(54321);
   MyNamedClass( mc2, nullptr);
   MyNamedClass( mc3, 12345 );

   return 0;
}