Есть ли способ переопределить поведение скобок по умолчанию? - PullRequest
0 голосов
/ 26 марта 2012

Я хочу перегрузить оператор ,, чтобы я мог назначить свою дробь, используя этот синтаксис: frac = 1, 2. Работало нормально без () операторов.

#include <iostream>

using namespace std;

class fraction {
private:
    int m_num;
    int m_den;

public:
    fraction(int num, int den) 
        :m_num(num), m_den(den) {

    }

    fraction& operator =(int num) {
        m_num = num;
        return *this;
    }

    fraction& operator ,(int den) {
        m_den = den;
        return *this;
    }

public:
    friend 
        ostream& operator <<(ostream& out, const fraction& rhs) {
        return out << rhs.m_num << ", " << rhs.m_den;
    }
};

int main() {
    fraction f(1, 2);   
    cout << "original f = " << f << endl;

    f = 4, 5;
    cout << "expected = " << f << endl;

    f = (10, 11);
    cout << "unexpected = " << f << endl;
}

** ВЫХОД

$ prog.exe
original f = 1, 2
expected = 4, 5
unexpected = 11, 5

Я случайно поставил () вокруг num и den, и из вывода я понял, что приоритет operator () повлиял на фактический результат. Он оценивается только с использованием operator ,, что является странным Итак, мой вопрос, есть ли способ (возможно, макрос?) Игнорировать влияние оператора () в этой конкретной ситуации?

1 Ответ

2 голосов
/ 26 марта 2012

Вы можете перегружать операторы только тогда, когда хотя бы один из аргументов определен пользователем. В вашем случае оба ваших аргумента будут int s, поэтому вы ничего не можете сделать.

(Кроме того, чтобы избежать сомнительного использования operator,!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...