2015-10-17 3 views
2

Скажем, у меня есть класс номерПерегрузки оператор + в классе

class Number 
{ 
public: 
    int numb; 

    Number (int g) 
    { 
     numb = g; 
    } 

    int operator+(int h) 
    { 
     return this->numb+h; 
    } 
}; 

И когда я пытаюсь использовать мой перегруженный оператор

cout << 3 + s; // doesn't work 
cout << s + 3; 

Я понимаю, почему он не работает, но я не» t знать, как заставить его работать для 3 + s

Конечно, я могу написать operator + с двумя аргументами вне класса, но я хочу, чтобы мой оператор перегружен в классе.

Я искал его, но не нашел решения.

ответ

1

Самый простой путь: написать еще одну перегрузку за пределами вашего класса

class Number 
{ 
public: 
    int numb; 

    Number (int g) 
    { 
     numb = g; 
    } 

    int operator+(int h) 
    { 
     return this->numb+h; 
    } 
}; 

int operator+(int h, Number& n) 
{ 
    return n.numb+h; 
} 

int main() 
{ 
    int s = 42; 
    std::cout << 3 + s; 
    std::cout << s + 3; 
} 

Live Example

Это также работает, если ваши данные частных (но убедитесь, что внешняя функция имеет доступ членам)

class Number 
{ 
    int numb; 

public: 
    Number (int g) 
    { 
     numb = g; 
    } 

    int operator+(int h) 
    { 
     return this->numb+h; 
    } 

    friend int operator+(int, Number&); 
}; 

int operator+(int h, Number& n) 
{ 
    return n.numb+h; 
} 
+0

Ваши друзья не всегда открыты публично, и общение с друзьями не может быть лучшим способом. – g24l

0

Просто напишите оператора вне класса, который вызывает тот, который находится в вашем классе!

template<typename T> T operator+(T a, Number& n) 
{ 
    return n+a; 
} 
1

Конечно, я могу написать оператор + с 2 аргументами вне класса, но я хочу, чтобы мой оператор перегружался в классе.

Это, как говорят: «Конечно, я мог забить гвоздь в моем с молотком, но я хочу использовать отвертку ...»

Некоторые другие решения предложили использовать как членом и не- член, но это избыточно: если вы добавите не-член, то вам больше не нужен член!

proper way перегружать operator+ является использование нечленом:

Number operator+(Number a, Number b) 
{ 
    return a.numb + b.numb; 
} 

Другой способ написать это использовать operator+= в качестве помощника (тогда ваш класс будет поддерживать += тоже):

Number operator+(Number a, Number b) 
{ 
    return a += b; 
} 

с функцией члена:

Number &operator+=(Number b) 
{ 
    numb += b.numb; 
    return *this; 
} 

Вы можете либо сделать operator+ return Number, либо int, на ваш выбор.

Смежные вопросы