我可以在运行时获取对象的名称(比如通过RTTI获取对象的类型)吗?我希望对象能够打印它的名字。
感谢。
答案 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;
}