C ++ перегружает (+) оператор - PullRequest
2 голосов
/ 19 ноября 2011

Я работаю над Упражнением 11.11 на странице 498 C ++. Как программировать 8-е издание.

Вопрос в следующем: создайте класс RationalNumber (дроби) со следующими возможностями: a) создайте конструктор, который предотвращаетзнаменатель 0 в дроби, уменьшает или упрощает дроби, которые не находятся в сокращенной форме, и избегает отрицательных знаменателей б) перегрузка операторов сложения, вычитания, умножения и деления для этого класса в) перегрузка операторов реляции и равенства для этого класса

Я работаю над перегрузкой оператора сложения.

Я выполнил (а), но не получаю никакой информации о перегрузке.Я искал в Интернете лучшее объяснение, но я просто не понимаю, как перегружать операторы пользовательскими типами.

Каждый RationalNumber имеет числитель и знаменатель, которые объединяются, чтобы образовать дробь.Мне нужно сложить их вместе, найти общий знаменатель и т. Д.

Мой RationalNumber.h выглядит так:

// RationalNumber.h
// RationalNumber class definition
#ifndef RATIONALNUMBER_H
#define RATIONALNUMBER_H

#include <iomanip>
#include <iostream>
#include <string>
using namespace std;

class RationalNumber
{

public:
RationalNumber( int numerator, int denominator);

void setNumerator(int numerator);
int getNumerator();

void setDenominator(int denominator);
int getDenominator();

void printRationalNumber();

RationalNumber operator+(Rationalnumber a, RationalNumber b);

private:
int numerator; //top number
int denominator; //bottom number
};

#endif

Теперь, просто сосредоточив внимание на моем операторе + функция:

RationalNumber RationalNumber::operator+(RationalNumber a, RationalNumber b)
{

}

Visual Studio сообщает, что в классе Rationaloperator нет члена "operator +"

Любая помощь будет принята.

Спасибо, Эрик

ОБНОВЛЕНИЕ:

Теперь у меня есть:

RationalNumber operator+(Rationalnumber a);

и

RationalNumber RationalNumber::operator+(RationalNumber a)
{

}

Я получаю ошибку: замедление несовместимо ..... (а)

Ответы [ 2 ]

9 голосов
/ 19 ноября 2011

+ - бинарный оператор. Если вы сделаете его членом, он должен принимать только один аргумент, поскольку вызывающим объектом является левый операнд.

Также обратите внимание, что вам не нужно делать это участником. Обычно я использую operator+= как член, затем operator+ как свободную функцию, которая использует operator+=. Это имеет преимущество в том, что левый или правый операнд может быть неявно преобразован. Например, если класс RationalNumber имел неявное преобразование из double:

RationalNumber r1,r2;
r1 = r2 + 3.14; // this will work either way
r1 = 3.14 + r2; // can't do this if operator+ is a member

Что касается вашей ошибки в несовместимых декларациях:

RationalNumber operator+(Rationalnumber a);
                                 ^
                       Should be a capital N
1 голос
/ 19 ноября 2011

вы можете рассмотреть эту статью часто задаваемых вопросов о перегрузке операторов в c ++.Ниже приведен пример перегрузки арифметических операторов.

class X { 
  X& operator+=(const X& rhs) 
  {
    // actual addition of rhs to *this 
    return *this;
  }
}; 
inline X operator+(X lhs, const X& rhs)
{
  lhs += rhs;
  return lhs;
} 

Обратите внимание, что operator+ реализован вне класса с использованием функции-члена operator+=.Также обратите внимание, что второй аргумент для operator+ передается по константной ссылке, что позволяет избежать копирования объекта, что повышает эффективность вашего кода.

Я не знаю, решает ли это вашу проблему, но эторассмотрение, безусловно, стоит вашего времени.

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