Софтуерно Инженерство
Loading...
+ Нов въпрос
pesosz avatar pesosz 4 Точки

Задача 4 от Домашното

Здравейте... стигнах до някакво решение на задачата, но ми е много чудно една част от кода, какво точно прави. Ето линк, към условието на домашното: https://judge.softuni.bg/Contests/Compete/DownloadResource/3940 

Ето го целия код на програмата: 
 

#include "ResourceType.h"
#include <string>
#include <istream>
#include <ostream>

using namespace std;

namespace SoftUni{
class Resource
{
private:
    int id;
    ResourceType type;
    string link;

public:
    Resource() {}

    Resource(int id, ResourceType type, std::string link)
            : id(id)
            , type(type)
            , link(link) {}

    int getId() const
    {
        return this->id;
    }
    ResourceType getType() const
    {
        return this->type;
    }
    string getLink() const
    {
        return this->link;
    }

    bool operator<(const Resource& other) const
    {
        return this->id < other.id;
    }
};

ostream& operator<<(ostream& out, const Resource& r)
{
    return out << r.getId() <<" "<< r.getType() <<" "<< r.getLink();
}

istream& operator>>(istream& in, Resource& r)
{
    int id;
    string typeString;
    string link;

    in >> id >> typeString >> link;

    ResourceType types;
    if (typeString == "Presentation") {
        types = ResourceType::PRESENTATION;
    }
    else if (typeString == "Demo") {
        types = ResourceType::DEMO;
    }
    else if (typeString == "Video") {
        types = ResourceType::VIDEO;
    }

    r = Resource(id, types, link);

    return in;
}
}

 

Въпросът ми е, какво прави следния operator overload: 
 

    bool operator<(const Resource& other) const
    {
        return this->id < other.id;
    }

намиращ се вътре в класа Resource.

Като цяло стигнах до някакво решение, но програмата ми изпищя, че тази част липсва и я добавих, но не съм абсолютно наясно какво точно прави.

Тагове:
0
C++ Advanced
j.petrov_90 avatar j.petrov_90 104 Точки

Привет, колега,

bool operator<(const Resource& other) const
{
    return this->id < other.id;
}

Това е оператор < (или можеш да го разглеждаш като оператор за сравнение между 2 обекта от тип Resource).
Щом имаш предефиниран този оператор можеш най-просто да кажеш:
Resource first(1, "test", "test");
Resource second(2, "test", "test");

if(first < second) {
    std::cout << "не те лъжа, ще вляза тук" << std::endl;
}

Защо ще влезе в if-a?
Защото operator< за обекти от тип Resource ги сравнява по id-та (по интове) и в тази връзка 1 е по-малко от 2 и оператора< ще върне true като резултат (return тип-а на operator<)
Т.е. за обекта "first" ще се викне operator< с аргумент "second", който ще се подаде като константна референция.

Ако вместо operator< го преименувахме на функция "checkIfSmaller" (с единствената разлика, че на "other" вече трябва да му ползваме getter-ите, защото нямаме пряка връзка до private полетата му)
bool checkIfSmaller(const Resource& other) const {
    return this->id < other.getId();
}

можехме да напишем горния if като:
if(first.checkIfSmaller(second)) {
    std::cout << "не те лъжа, ще вляза тук" << std::endl;
}

0
18/02/2019 10:33:03