У меня есть функция, которая работает очень хорошо. Однако мне нужно использовать оператор перегрузки в нем, и это не работает для меня, потому что я получаю ошибки. У меня есть небольшой пример из теории, в которой она написана так:
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;
}
Вы правильно перегрузили 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
Предположим, вы хотите перегрузить оператор> для класса 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 ;
}
bool Knyga::operator > (const Book & next)
вероятно, должен бытьbool Book::operator > (const Book & next)