是否也可以获得对象名称?
#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";
}
在那里我可以找到名字,比如
[classname] = A.classname() = one
[objectname] = A.objectname() = A
C++是否提供了实现此功能的机制?
9条答案
按热度按时间epggiuax1#
你可以用预处理器显示变量的名字。
产出
#
将标记更改为字符串,在预处理该行后,当然,如果你做一些
你会得到
因为编译器不会跟踪所有变量的名称。
就像gcc中发生的那样,typeid(). name()的结果是被破坏的类名,要获得demangled version使用
这给了我
其他编译器可能使用不同的命名方案。
sulc1iza2#
使用
typeid(class).name
//假定所有包含/命名空间等的说明性代码
重要的是要记住,这给了一个实现定义的名称。
据我所知,没有办法在运行时可靠地获得对象的名称,例如代码中的"A"。
编辑2:
rxztt3cl3#
要获得类名而不损坏内容,可以在构造函数中使用func宏:
tez616oj4#
是否希望[类名]为“一”,[对象名]为“A”?
如果是这样的话,这是不可能的。这些名称只是程序员的抽象,实际上并没有在生成的二进制代码中使用。你可以给予类一个静态变量classname,你可以将它设置为'one',和一个普通变量objectname,你可以通过一个方法或构造函数直接赋值。然后你可以查询这些方法以获得类和对象的名称。
iyzzxitl5#
只需编写简单的模板:
r1zhe5dt6#
您可以尝试使用"typeid"。
这对“对象”名不起作用,但是你知道对象名,所以你只需要把它存储在某个地方。编译器不关心你给对象起什么名字。
不过,值得记住的是,typeid的输出是编译器特有的,所以即使它在当前平台上产生了你想要的结果,在另一个平台上也可能没有,这对你来说可能是个问题,也可能不是。
另一种解决方案是创建某种类型的模板 Package 器来存储类名,然后需要使用部分专门化来让它为您返回正确的类名,这有编译时工作的优势,但明显更加复杂。
编辑:更加明确
然后,对于每个类,类似于以下内容:
它甚至可以是宏,如下所示:
允许你,简单地,做
最后,要获取类名,您需要执行以下操作:
Edit2:更详细地说,您需要将这个“DefineClassName”宏放在您创建的每个类中,并定义一个调用静态模板函数的“classname”函数。
Edit3:想一想......早上第一件事显然是不好的发布,因为你还不如定义一个成员函数“classname()”如下:
可按如下方式进行宏处理:
然后你就可以
按照您定义的那样添加到类中。
vddsk6oq7#
你可以试试这个:
就像这样称呼它:
bwntbbo38#
@Chubsdad回答的改进,
将打印:
hjqgdpho9#
下面是获取所创建类的名称的技巧:
输出:
一个小的字符串操作将剥离不需要的部分