我有一个名为Student的类,并且正在主程序中创建实例Alex。创建实例Alex时,可以打印“正在创建Alex”。如果变量名称为“ Joe”,则应打印“正在创建Joe”。
这是我的课堂定义
class Student
{
public:
int rollNo;
string address;
Student(int rollNo, string address)
{
this.rollNo = rollNo;
this.address = address;
}
//setter , getter functions.
};
//在主程序中
Student Alex;
Student Joe;
注1:是的,我们可以在Student类中具有变量“ name”,并在实例化它时传递名称Alex / Joe并根据需要在构造函数中打印。但这不是我的情况。我纯粹不想传递姓名
答案 0 :(得分:4)
没有方法,没有宏会自动执行此操作,因为C ++不支持反射。一种可能性是在呼叫站点上使用宏:
#define CREATE_VARIABLE(type, name) \
::std::cout << "Creating " #name " of type " #type << '\n'; \
type name
用作:
CREATE_VARIABLE(Student, Alex);
CREATE_VARIABLE(Student, Joe){joeRollNo, joeAddress};
答案 1 :(得分:0)
否,因为变量名是表达式的一部分,该表达式在声明它的作用域中引用您的对象。
该对象本身不可用,甚至可能在运行时不存在,并且无论如何在C ++中创建匿名对象(由任何命名表达式引用或由多个不同命名对象引用的对象)都是微不足道的表达式。
您当然可以明确地执行此操作,或者使用Vittorio显示的宏进行操作。
答案 2 :(得分:0)
创建时无法打印变量的名称。而且确实不是那么安全。考虑以下代码:
Student Alex;
Student Joe;
Student &some_student = Alex;
Student *another_student = &Alex;
Student Alex;
void print_students_address(const Student &student);
在每行中应打印什么名称?您是否要用地址而不是变量名“ student”打印学生姓名?
正确的解决方案是将一个成员“字符串名称”添加到Student类。