实例化时如何打印类类型变量的名称?

时间:2019-07-11 10:42:19

标签: c++

我有一个名为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并根据需要在构造函数中打印。但这不是我的情况。我纯粹不想传递姓名

3 个答案:

答案 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类。