Loading...
Jovanna avatar Jovanna 186 Точки

C++ Advanced task04_05 - Lectures - Проблем с форийч-а

Здравейте,

защо при положение че имам в класа Lecture разлисани операторите .begin() и .end()  не иска да работи кода на for-each-a от main() ?

(Класът ми има едно поле: сет от Resource)

    std::set<Resource>::iterator begin(const Lecture& lect) {
            return (this->dataSetResources).begin();
        }
        std::set<Resource>::iterator end(const Lecture& lect) {
            return this->dataSetResources.end();
        }

Поздрави!

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

Здравей,

Не си написала методите begin() и end(). Написала си методите begin(const Lecture&) и end(const Lecture&)

C++ range-based for цикъла нмяма как да знае какво е това lect което трябва да ти подаде на функциите (което ти не го ползваш между другото). То знае, че трябва да извика begin() и end() без параметри, а ти такива не си му дефинирала.

Най-вероятно си мислиш, че параметъра, който декларираш, ама не ползваш за нищо, е това, което всеки път се дава като елемент при итерация на for цикъла. Не е така. Цикъла просто дереференцира итератора, който си му върнала от begin(), след това го увеличава с ++ докато не стигне до end(). 

Тоест кода, който се разписва, когато напишеш

for(Resource r : resources) { ... } 

е еквивалентен на

for(set<Resource>::iterator i = resources.begin(); i != resources.end(); i++) {

   Resource r = *i;

}

(Като тук ползвам set, защото това ползваш ти вътрешно в класа си) Както виждаш, begin и end се викат без параметри, а стойността на Resource обекта на всяка итерация се взема от итератора.

Поздрави,

Жоро

0
Jovanna avatar Jovanna 186 Точки

Благодаря за отговора! Но, това което продължава да не ми е ясно, как се итерира (const Resource& r : lecture), след като в main()  има само един обект от тип Lecture, как ще го итерирам? Нищо че полето,което има класа Lecture (единствено) е сет от Resource.

Също, не разбирам декларирания в началото мап std::map<ResourceType, int> numberOfResourcesByType; къде и как се ползва

Поздрави!

0
Jovanna avatar Jovanna 186 Точки

Дали с reinterpret_cast би могло да стане? само не знам как да го накарам да се итерира с размера на сет-а а не с р-ра не Lecture:

Lecture* begin() const {            
            std::set<Resource>::iterator si = this->dataSetResources.begin();            
            Lecture* lsi = reinterpret_cast<Lecture*>(&si);
            return lsi;
        }
        Lecture* end() const {
            std::set<Resource>::iterator si = this->dataSetResources.end();            
            Lecture* lsi = reinterpret_cast<Lecture*>(&si);
            return lsi;
        }

0
MartinBG avatar MartinBG 4803 Точки

 

Това, върху което се очаква да итерираш в main() е колекция от Resource и съответно трябва да подадеш итератор от този тип (ползва се наготово итератора на STL колекциятa, която ползваш в Lecture - в случая е set):

    std::set<Resource>::iterator begin() const {
      return this->dataSetResources.begin();
    };

    std::set<Resource>::iterator end() const {
      return this->dataSetResources.end();
    };
std::map<ResourceType, int> numberOfResourcesByType;

Горната декларация от main() не се използва никъде в програмата, както правилно си забелязала (отговарям и на другият ти въпрос).

0
Jovanna avatar Jovanna 186 Точки

Благодаря! 

но нали с форийч-а итерираме обект от тип Lecture,  според мен, компилаторът би трябвало да търси .begin() на контейнер с обекти от тип Lecture. A в случая на форийча му подаваме само един обектм а не контейнер с обекти. Това възможно ли е? Въпреки това, логично е да търси .begin() и .end() от  тип Lecture? Или бъркам?

2/И, имаме ли гаранция , че заделената памет за контейнер с един обект от тип Lecture e == на заделената памет за обект от тип Lecture;

3/Също, заделената памет за един set  == ли е на заделената памет за обект, който има поле същия този сет?

 Поздрави!

0
MartinBG avatar MartinBG 4803 Точки

Foreach-a работи с итератори и не го интересува към какви обекти сочат те. Типа на обектите не е задължително да съвпада с типа на класа, в който са дефинирани begin() и end() методите.

С други думи - няма значение в какъв обект (в случая е Lecture) се намира колекцията (vector<Resource>), която се итерира, важни са единствено итераторите, които този обект подава чрез begin() и end() методите си към foreach-a.

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