Loading...
niagara avatar niagara 22 Точки

C++ Advanced - 04. Advanced C++ Class Members - Task 4 - Resources

Здравейте, някой може ли да хвърли малко светлина върху енумерациите, по точно как да въведем стойност. От main-а разбирам, че r.type e ResourceType, но при следния метод:

istream& operator>>(istream& In, Resource& r)
    {
        return In >> r.id >> r.type >> r.link;
    }

получавам грешка: no match for 'operator>>' (operand types are 'std::basic_istream<char>::__istream_type {aka std::basic_istream<char>}' and 'SoftUni::ResourceType')

Как да въведа полето тогава? Явно тези неща са ми минали покрай ушите и са си заминали ;D. Ще съм благодарна ако някой ми разясни.

Тагове:
0
C++ Programming
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки
Best Answer

Здравей,

Правилно забелязваш, че не можеш директно да прочетеш стойност на енумерация от входа - поне не и без да си дефинираш твой оператор за въвеждане.

Но има краен брой възможни стойности за тази енумерация, а това, което се въвежда на конзолата е просто string (всичко, което се въвежда на конзолата е string, просто за някои типове има вградена логика в езика за получаване на съответните стойности от string-ове).

Така че не се опитвай да го четеш директно - просто прочети един string и сложи няколко if-else, които при определена стойност на string-а записват определена стойност на енумерацията в обекта. Може да погледнеш operator overload-а за извеждане в ResourceType файла и да напишеш просто логиката наобратно.

Поздрави,

Жоро 

1
niagara avatar niagara 22 Точки

Здравей, опитах и така, но ми изкарва друга грешка: no match for 'operator<' (operand types are 'const SoftUni::Resource' and 'const SoftUni::Resource')

Предполагам, че грешката е при този запис:

void operator>>(istream& In, Resource& r)
    {
        string t;
         In >> r.id >> t >> r.link;
         if(t == "Presentation")
         {
            r.type = PRESENTATION;
         }
        else if(t == "Demo")
        {
            r.type = DEMO;
        }
        else
        {
            r.type = VIDEO;
        }
    }

Въобще нещо ми се губи при работата с енумерации. Би ли ми казал, в коя лекция се споменават, за да си припомня.

0
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки

Този код ми изглежда верен, грешката, която ти дава, не е за operator<<, а за operator<, който най-вероятно overload-ваш за да можеш да добавяш Resource обекти в set.

И това, което ти казва, е че параметрите на operator< трябва да са const обекти (или const референции) за да може да го ползва set-а (най-вероятно си забравила да напишеш const пред един от двата параметъра). Може да погледнеш последните слайдове на лекцията, там имаше quick quiz точно за тази ситуация.

Иначе за enum говорихме в последната лекция на C++ Fundamentals, тази за класове и обекти, в първите слайдове - но не сме задълбочавали много. Като цяло ми се струва, че ги разбираш достатъчно добре, но прегледай отново ако искаш.

 

2
niagara avatar niagara 22 Точки

Много благодаря! Направо ме е срам каква нелепа грешка съм направила и си блъскам няколко часа главата. Но така е като пиша код между задачите по математика и анализа на античната драма.

0
peter.gaydeek avatar peter.gaydeek 2 Точки

Колеги на мен пък ми дава тази грешка: binary '<': no operator found which takes a left-hand operand of type 'const _Ty' (or there is no acceptable conversion) ... това е част от кода ми и се чудя дали тук не бъркам нещо понеже навсякъде имам констанци както си му е реда...
 

namespace SoftUni {
    struct Resource 
    {
        int id;
        ResourceType resType;
        std::string link;


        ResourceType getType() const{ return resType; }  //  Да не би тук нещо да трябва да направя ? 

        friend std::istream& operator>>(std::istream& inp, Resource& r);
        friend std::ostream& operator<<(std::ostream& out,const Resource& r);
    };

0
kolioi avatar kolioi 641 Точки

В main() имаш set от ресурси и той трябва да знае как да подреди обектите в него, т.е. ако имаш 2 обекта от клас/структура Resource кой от тях да бъде преди другия в сета. Затова ти трябва тази функция operator< Можеш да я направиш по 2 начина - като метод на класа/структурата Resource или като самостоятелна функция извън Resource. Това се учи в предишния курс C++ Fundamentals.

0
peter.gaydeek avatar peter.gaydeek 2 Точки

Разбрах колега. Много ти благодаря!

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