Препроцессор C ++ и оператор + перегрузка - PullRequest
0 голосов
/ 29 января 2012

Я хочу использовать препроцессор C ++, чтобы иметь возможность записать следующее в любом блоке C ++.

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

}

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

Предыдущий код создаст Студента с этими 3 участниками. Я хочу использовать + оператор перегрузки.

Есть идеи, как это сделать? Я хочу ТОЛЬКО синтаксис, который я упомянул выше.

Ответы [ 3 ]

3 голосов
/ 29 января 2012

Почему бы просто не использовать конструктор:

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);
}
1 голос
/ 29 января 2012

Ну, я совершенно не понимаю , почему вы хотели бы сделать такую ​​вещь. Но это возможно, Сорта.

Вам нужно будет сделать его немного более сложным, чтобы иметь возможность использовать более одной такой "конструкции" в одном блоке.

#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;
}
1 голос
/ 29 января 2012

Вы должны шаблонировать свой класс вместо того, чтобы работать с препроцессором.

...