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
Jovanna avatar Jovanna 186 Точки

Здравейте, и аз срещнах проблем с тази задача. Кода съм го написала с map (необходим ми е за нормализацията) и нормализация на обекта при въвеждането му, като второто ми поле на обекта е от тип enum. Но, при извеждането на конзолата, се сърди за:       if (iterr->second == typeInEnum) ,  ( обхождам map-a ):

std::ostream& operator<<(std::ostream& out, const Resource& r) {
        std::string typeString;
        for (auto iterr = mapEnum.begin(); iterr != mapEnum.end(); iterr++) {
            ResourceType typeInEnum = r.getType;
            if (iterr->second == typeInEnum) {    //Тук VS  дава грешка
                typeString = iterr->first;
            }
        }        
        out << r.id << " " << typeString << " " << r.link;
        return out;
    }

Грешката, която VS дава е: "Not standard syntax". Kaкъв е начина да се накара този запис да работи? Иначе с if-else -ове си става.

Поздрави!

0
02/10/2018 13:05:25
kolioi avatar kolioi 641 Точки

getType() е метод, сложи му скобите

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