1

Тема: Перевантаження операторів

Потрібно перевантажити оператор порівняння (> або <=), а також перевантажити оператор виводу в потік
Перевантажити потрібно в класі "Flight.h" тривалість рейсів, але я не розумію як це зробити з циклом, де дані вводяться з клавіатури користувачем. Я пробував щось зробити з цим, але не виходить

main.cpp

#include <iostream>
#include <string>

#include "Flight.h"
#include "Plane.h"

using namespace std;

int main()
{
    setlocale(0, ".1251");
    Plane planedef;
    Plane planecop(planedef);
    const int count_planes = 3;
    Plane plane[count_planes];
    for (int i = 0; i < count_planes; ++i) {
        string name;
        int weight, date;
        cout << "Введiть назву та рiк випуску лiтака: " << endl;
        cin >> name >> date;
        plane[i].setNd(name, date);
        cout << "Введiть цiну лiтака: " << endl;
        cin >> weight;
        plane[i].setW(weight);
    }
    for (int i = 0; i < count_planes; i++) {
        cout << plane[i].getNd();
    }
    const int count_flights = 2;
    Flight flight[count_flights];
    for (int i = 0; i < count_flights; ++i) {
        string name_flight;
        int duration;
        cout << "\nВведiть назву та тривалiсть рейсу: " << endl;
        cin >> name_flight >> duration;
        flight[i].setF(name_flight, duration);
    }
    for (int i = 0; i < count_flights; i++) {
        cout << flight[i].getF();
    }
    return 0;
}

Flight.h

#pragma once
#include <string>

using namespace std;

class Flight {
private:
    double x, y;
    string name_flight = "";
    int duration = 0;
    bool CheckPlane(int date_check) {
        if (date_check >= 0 && date_check <= 2022) {
            return true;
            return false;
        }
    }
public:
    Flight()
    {
        std::cout << "\nFlight default constructor" << std::endl;
        name_flight = "Невiдомий рейс";
        duration = 0;
    }
    Flight(std::string nf, int df) : name_flight(nf), duration(df)
    {
        std::cout << "Flight constructor: " << name_flight << std::endl;
    }
    Flight(const Flight& other) : name_flight(other.name_flight), duration(other.duration)
    {
        std::cout << "Flight copy constructor: " << name_flight << std::endl;
    }
    ~Flight()
    {
        std::cout << "\nFlight destructor: " << name_flight << std::endl;
    }
    friend Flight operator < (const Flight& d1, const Flight& d2) {

    }
    string getF() {
        string answer = "\nНазва рейсу: " + name_flight + "\nТривалiсть: " + to_string(duration);
        return answer;
    }
    void setF(string nf, int df) {
        bool nPlane = CheckPlane(df);
        if (nPlane) {
            name_flight = nf;
            duration = df;
        }
        else {
            cout << "Не вірні параметри" << endl;
        }
    }
};

2

Re: Перевантаження операторів

romanio001 написав:

Потрібно перевантажити оператор порівняння (> або <=), а також перевантажити оператор виводу в потік

 friend Flight operator < (const Flight& d1, const Flight& d2) {   }

Оператор <, (чи >, <=, >=, ==, !=) має повертути bool, отже оголошення функції буде мати наступний вигляд friend bool operator < (const Flight& lhs, const Flight& rhs);. Потім повертаємо той вираз, котрий вам потрібно. За вашою умовою буде return lhs.тривалість рейсів < rhs.тривалість рейсів;

Оголошення перевантаження оператова виводу в потік буде:  friend ostream& operator<<(ostream&, const Flight&);
Визначення:

ostream& operator<<(ostream& out, const Flight& ob) {
    return out << ob.Властивості класу << ob. котріб потрібно вивести в потів виводу <<  ... ;
}

3

Re: Перевантаження операторів

romanio001 написав:

але я не розумію як це зробити з циклом, де дані вводяться з клавіатури користувачем. Я пробував щось зробити з цим, але не виходить

Що саме ви мали на увазі?

    const int count_flights = 2;
    Flight flight[count_flights];
    /* ... */
    for (int i = 0; i < count_flights; i++) {
        cout << flight[i]; // Ось так має бути. Ви маєте працювати із поток виводу, як із будь якими іншими даним
    }
if (flight[0] < flight[1])
    /* ... */

4

Re: Перевантаження операторів

lucas-kane написав:
romanio001 написав:

але я не розумію як це зробити з циклом, де дані вводяться з клавіатури користувачем. Я пробував щось зробити з цим, але не виходить

Що саме ви мали на увазі?

    const int count_flights = 2;
    Flight flight[count_flights];
    /* ... */
    for (int i = 0; i < count_flights; i++) {
        cout << flight[i]; // Ось так має бути. Ви маєте працювати із поток виводу, як із будь якими іншими даним
    }
if (flight[0] < flight[1])
    /* ... */

Так, я розумію, що маю працювати із потоком виводу, але в мене все базується на функції getF(), яка виводить інформацію у потік. Тому, я не знаю як все правильно реалізувати в даному випадку

5

Re: Перевантаження операторів

Ну от замість getF і напишіть власний оператор.

6

Re: Перевантаження операторів

Чи можете реалізувати це все? Я ніяк не можу з цим розібратись

7

Re: Перевантаження операторів

Я? Можу. Але це вам не допоможе навчитися. Єдиний спосіб навчитися - зробити самому. Напишіть, що у вас виходить, порівняйте з підручником, проаналізуйте повідомлення про помилки. Якщо не вийде - питайте. Але за вас вашу роботу тут навряд чи зроблять, хіба що підкажуть напрямок.