【问题标题】:C++ preprocessor and operator + overloadingC++ 预处理器和运算符 + 重载
【发布时间】:2012-01-29 13:23:44
【问题描述】:

我希望使用 C++ 预处理器能够在任何 C++ 块中编写以下内容。

class Student {
private:
    int age;
    int grade;
    int courses;

}

int main(){
    CREATE_STUDENT 15+62+2 ;
}

前面的代码将创建一个包含这 3 个成员的 Student。 我想使用+ 运算符重载。

知道怎么做吗? 我想要上面提到的语法。

【问题讨论】:

  • 你为什么要这样做而不是简单的对象创建? (注意,在考虑运算符重载之前,预处理器已经运行完毕。)
  • 为什么不是构造函数:Student(int a_age, int a_grade, int a_courses) : age(a_age), grade(a_grade), courses(a_courses) {}?像Student s(15, 62, 2); 一样使用它

标签: c++ operator-overloading c-preprocessor


【解决方案1】:

为什么不直接使用构造函数:

class Student {
private:
    int age;
    int grade;
    int courses;
public:
    Student(int a, int g, int c)
    {
        age = a;
        grade = g;
        courses = c;
    }
}

int main(){
    Student s(15,62,2);
}

【讨论】:

  • 我想用 C++ 预处理器来做。我想要的正是我在 main 中编写的语法。
  • 我什至不确定是否可以按照您的建议进行操作,但即使可以,您为什么要这样做?!我提供的代码与标准 C++ 一致,而您的建议很危险,根本不是标准 C++,而且从逻辑角度很难理解。
  • “有什么问题,先生?” ——“恐怕你的语言不符合我的语法。” ...这是一个非常奇怪的要求,我怀疑您能否希望有一个通用的解决方案。
【解决方案2】:

好吧,我完全不明白为什么你会想要做这样的事情。但这是可能的。

不过,您需要使它更复杂一些,才能在同一个块中使用多个这样的“构造”。

#include <iostream>

#define GRADE_STUDENT Student student = (Student)

class Student {
    public:
        Student(int a): age(a), grade(-1), courses(-1), setup(0) {};
        Student& operator+(int p)
        {
            switch(setup) {
                case 0: grade = p; break;
                case 1: courses = p; break;
                default: /* die */ char *p=0; *p=0;
            }
            setup++;
            return *this;
        };
        void print()
        {
            std::cout << age << ", " << grade << ", " << courses << std::endl;
        };
    private:
        int age;
        int grade;
        int courses;
        int setup;
};

int main()
{
    {
        GRADE_STUDENT 15+62+2 ;
        student.print();
    }
    {
        GRADE_STUDENT 15+62 ;
        student.print();
    }
    {
        GRADE_STUDENT 15+62+2+3 ; // crash
    }
    return 42;
}

【讨论】:

  • 非常感谢您的回复。这是我试图接近它的方式,但是这个 codeGRADE_STUDENT 15+62+2 ;在函数调用 Student& operator+(int p) 之前添加表达式 15、62 和 2。
  • 非常感谢。我正在尝试这个,但没有投给学生。确实使用这种转换,在添加表达式之前进入构造函数。
  • 现在你能解释一下为什么你想要这个吗?这是一个非常非常糟糕的主意。
  • 更简洁的方法是使用类型系统在编译时检测错误数量的操作数:ideone.com/H6Gc7
  • @visitor:您可以将其发布为答案
【解决方案3】:

您应该模板化您的类,而不是使用预处理器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 2014-12-04
    • 2023-03-17
    相关资源
    最近更新 更多