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 373 Точки

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

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
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.