Как использовать оператор перегрузки> в функции

0

У меня есть функция, которая работает очень хорошо. Однако мне нужно использовать оператор перегрузки в нем, и это не работает для меня, потому что я получаю ошибки. У меня есть небольшой пример из теории, в которой она написана так:

int MaxPrice(Container & A, string name) // finds an element number with maximum price of a book
{
int max = 0, n = A.GetN();
while (max < n && A[max].GetName() != name)
max++;
if (max == n)
return -1;
Book maxBook = A[max];
for (int i = max; i < n; i++)
if (A[i] > maxBook) {
maxBook = A[i];
max = i;
}
return max;
}

И у меня есть моя письменная функция:

double MaxPrice(Books & A, string nm) // finds maximum price of a book
{
    double maxPric = 0.0;

    for (int i = 0; i < A.Get(); i++)
    {
        if (A.Get(i).GetName() == pv && A.Get(i).GetPrice() > maxPric)
            maxPric = A.Get(i).GetPrice();
    }

    return maxPric;
}

Мои классы - книги и книги (контейнерный класс):

class Book
{
private:
    string publisher;   // book publisher
    string name;        // name of a book
    int quantity;       // quantity of a book
    double price;       // price of one book
public:
    Book(): publisher(""), name(""), quantity(1), price(0.0) { }
    Book(string publish, string nam, int quantit, double pric): 
        publisher(publish), name(nam), quantity(quantit), price(pric) { }
    ~Book() { }

    void Set(string pu, string na, int qu, double pr);
    void SetName(string pu);
    void SetPrice(double pr);

    string GetPublisher() { return publisher; };
    string GetName() { return name; };
    int GetQuantity() { return quantity; };
    double GetPrice() { return price; };


    bool operator > (const Book & next);

};

void Book::Set(string pu, string na, int qu, double pr)
{
    publisher = pu;
    name = na;
    quantity = qu;
    price = pr;
}

void Book::SetName(string na)
{
    name= na;
}

void Book::SetPrice(double pr)
{
    price = pr;
}

bool Book::operator > (const Book & next)
{
    return (price > next.price);
}
//----------------------


class Books
{
public:
    static const int Cn = 100;  // maximum number of books
private:
    Book K[Cn]; // books data
    int n;          // quantity of books
public:
    Books(): n(0) { }
    ~Books() { }

    int Get() // returns quantity of books
    { return n; };  

        void Set(Book new)  // add a new book to array of books 
    { K[n++] = new; }       // and pluses one to quantity of books

    Book Get(int ind)   // returns object by index
    { return K[ind]; }

    double Sum();
};

double Books::Sum()
{
    double sum = 0;

    for (int i = 0; i < n; i++)
        sum += K[i].GetPrice();
    return sum;
}
  • 1
    Был ли там вопрос где-нибудь? bool Knyga::operator > (const Book & next) вероятно, должен быть bool Book::operator > (const Book & next)
  • 2
    «Я получаю ошибки». Скажите нам ошибки.
Теги:

2 ответа

0

Вы правильно перегрузили operator >. После того, как вы загрузили оператора в Book, вы можете использовать его как book1 > book2
Я изменил ваш MaxPrice() на:

double MaxPrice(Books & A) // finds maximum price of a book
{
    if(A.Get() == 0) return -1;
    Book curExpensiveBook = A.Get(0);
    for (int i = 1; i < A.Get(); i++)
    {
        if(A.Get(i) > curExpensiveBook) //Compare directly by using >
            curExpensiveBook = A.Get(i);
    }
    return curExpensiveBook.GetPrice();
}

Но в вашем коде есть другая проблема: в Books::Set(Book) вы не можете использовать new качестве имени параметра в C++, а new зарезервированное ключевое слово в C++:

void Set(Book new)  // add a new book to array of books 
    { K[n++] = new; }

Измените его на другое имя:

void Set(Book newBook)  // add a new book to array of books 
        { K[n++] = newBook; }

Ниже приведена рабочая демонстрация вашего кода: http://ideone.com/XYJBA2

0

Предположим, вы хотите перегрузить оператор> для класса Book.

class Book
{
private:
    string publisher;   // book publisher
    string name;        // name of a book
    int quantity;       // quantity of a book
    double price; 

Сначала вам нужно решить, какой член вы решите сравнить объекты книги. Возьмите имя как ключ, на котором мы будем перегружать operator>.

bool operator> ( const Book& book )
{
  return name > book.name ;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню