2013-04-21 2 views
0

Я пытаюсь перегрузить оператор + в C++, но получаю следующее сообщение об ошибке:Перегрузки "+" - оператор

operators.cpp: In function ‘int main()’:
operators.cpp: 23:17: error: cannot convert ‘Operators’ to ‘int’ in initialization

Это мой код:

#include <iostream> 
using namespace std; 

class Operators{ 
    private: 
     int num1; 

    public: 
     Operators(int num1){ 
      this->num1 = num1; 
     } 
     Operators operator+(Operators o){ 
      return Operators(num1 + o.num1); 
     } 
}; 

int main(){ 
    Operators o1(5); 
    Operators o2(10); 
    Operators res = o1 + o2; // EDITED 

    cout << res; 
} 

Не могли бы вы, пожалуйста, помогите меня?

Я знаю, в этом случае не имеет смысла перегружать его, поскольку я мог бы просто сказать 5+10, но я просто экспериментирую.

UPDATE Спасибо, я редактировал int.
Но теперь я получаю следующее сообщение об ошибке:

operators.cpp: In function ‘int main()’:
operators.cpp: 25:10: error: match for ‘operator<<’ in ‘std::cout << res’
[...]

+0

Ваше изменение полностью изменило вопрос. Вы не должны этого делать. Если у вас другой вопрос, задайте другой вопрос. – juanchopanza

ответ

4

Проблема с этой линией:

int res = o1 + o2; 

Это ваша перегрузка operator + возвращает объект типа Operators. Это означает, что вы пытаетесь инициализировать int (res) от временного типа Operators (результат o1 + o2), но нет определенного пользователя преобразования для выполнения этого.

Поэтому компилятор выдает сообщение об ошибке . вы можете исправить это легко, добавив оператор преобразования к вашему Operators класс:

operator int() const { return num1; } 

UPDATE:.

кажется, вы обновили свой вопрос Вторая строка быть низким является проблематичным:

Operators res = o1 + o2; 
cout << res; 

Если вы не определили перегрузки operator << для Operators класса, компилятор не будет знать, какие перегрузки operator << выбрать для потоковой передачи объекта типа Operators.

Чтобы решить эту проблему, вы можете:

  • Определение оператора преобразования в int, как предложено выше
  • Определение перегрузки operator << для Operators следующим образом:

    friend std::ostream& operator << (std::ostream& o, Operators const& op) 
    { 
        o << op.num1; 
        return o; 
    } 
    

Описание: live example.

+0

Спасибо, сейчас работает! Но что это за строка для 'operator int() {return num1; } '? – user1170330

+1

@ user1170330: Это оператор преобразования. Он позволяет неявно преобразовывать объект типа 'Operators' в' int' –

+0

И что, если у меня есть несколько чисел, например 'int num1, num2, num3;'? – user1170330

3

Как указано в сообщении об ошибке, o1 + o2 имеет тип Operators.
Вы не можете назначить, что к int

+0

Спасибо, но не могли бы вы взглянуть на мою новую ошибку? – user1170330

+0

@ user1170330: У вас нет перегрузки 'operator <<' для 'Operators', а не оператор преобразования из' Operators' в 'int'. Мой ответ должен решить вашу проблему. –

+0

Тупой вопрос, но зачем мне перегружать < user1170330

1

Ваш operator+ возвращает Operators объект. Затем вы попытаетесь присвоить этот результат int res.Вы не имеете возможности конвертировать из объекта Operators в int. Вы могли бы предоставить оператор преобразования, чтобы сделать это:

operator int() { 
    return num1; 
} 

Это определяет преобразование из Operators в int.

0

Измените int на Operators и реализуйте собственную копию и конструктор по умолчанию.

#include <iostream> 

class Operators 
{ 
    private: 
     int num1; 

    public: 
     Operators() = default; 
     Operators(Operators const& op) : num1(op.num1) {} 
     Operators(int num1) 
     { 
      this->num1 = num1; 
     } 
     Operators operator+(Operators o) 
     { 
      return num1 + o.num1; 
     } 
}; 

int main() 
{ 
    Operators o1(5); 
    Operators o2(10), res; 

    res = o1 + o2; 

    std::cout << res; 
} 

Чтобы сделать эту работу дальше, создать перегрузку operator<< и напечатать сумму.

0

Вам нужно написать:

int res = o1.getMethod() + o2.getMethod(); 

где getMethod() это публичный метод в классе, который возвращает частное целое num1. В противном случае у вас нет доступа к нему. Попробуй.

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