【问题标题】:How to print name of the variable of class type while its getting instantiated?如何在实例化时打印类类型变量的名称?
【发布时间】:2019-07-11 10:42:19
【问题描述】:

我有一个名为 Student 的类,我正在主程序中创建一个实例 Alex。创建实例 Alex 时,是否可以打印“正在创建 Alex”。如果变量名是“Joe”,它应该打印“Joe is being created”。

这是我的班级定义

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,并在构造函数中按要求打印。但这不是我的情况。我纯粹不想传名字

【问题讨论】:

标签: c++


【解决方案1】:

没有宏无法自动执行此操作,因为 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};

【讨论】:

    【解决方案2】:

    不,因为变量名是表达式的一部分,它在声明它的范围内引用您的对象。

    它对对象本身不可用,甚至可能在运行时不存在,无论如何,在 C++ 中创建未被任何命名表达式引用的匿名对象或由多个不同命名的对象引用的对象是微不足道的表达式。

    当然,您可以显式执行此操作,或者使用 Vittorio 显示的宏。

    【讨论】:

      【解决方案3】:

      您不能在创建时打印变量的名称。这真的没有帮助。考虑这段代码:

      Student Alex;
      Student Joe;
      Student &some_student = Alex;
      Student *another_student = &Alex;
      Student Alex;
      void print_students_address(const Student &student);
      

      应该在每一行中打印什么名称?你不想用地址而不是变量名打印学生姓名:“学生”吗?

      正确的解决方案是将成员“字符串名称”添加到 Student 类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-08
        • 1970-01-01
        • 2011-10-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多