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

обхождане на SET с обекти

Защо при обхождане на сет с обекти с итератор ( set<someObject>setData;   )

for (auto it = setData.begin(); it != setData.end(); it++)  {
                if ((*it).   )    / или   if ( it ->     не разпознава и не позволява да се изведат полетата на обекта, които са дефинирани в класа:

дефинирано поле в класа:  
    string getName() {
        return this->name;
    }

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

Така написан кодът ми изглежда вярно - стига someObject да е клас, който поддържа

bool operator<(const someObject& other) const { ....... } 

- ако не го поддържа, би следвало да имаш компилационна грешка на реда с декларацията на този set. Ако го поддържа би следвало спокойно да можеш да достъпваш членове на класа, стига да са public

string itemName = it->getName(); // ако getName() е public

Какви грешки получаваш? На кой ред точно ти дава грешка?

1
MartinPaunov avatar MartinPaunov 75 Точки

Здравей, ако може да дадеш един pastebin на кода, защото не мога да разбера точно въпроса ти.

1
Jovanna avatar Jovanna 79 Точки

имам  дефиниран bool operator<  

Не съм компилирала, защото е в червено кода  ред 83 85, 104 и 106 и не мога да извадя полетата, примерно на:

    if ((*it).   ) 

ето кода в pastebin  https://pastebin.com/W5mz2D9d

 

0
MartinPaunov avatar MartinPaunov 75 Точки

В кода предефенирания оператор беше' >', а не '<'. Смени го както след ключовата дума operator, така и при return.

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

Visitor currVisitor = *it; - така работиш върху обект, който е същия, като текущия и можеш да ползваш същите методи със същия резултат. Мисля, че след края на блока код в който е деклариран този обект ще се освободи от паметта.

След като промених двете неща в програмата ти тръгна без проблем, но ми изглежда, че не работи добре за command == "name".

Не съм сигурен пробвай и провери дали ще стане така. Също така не съм сигурен, че това е най-добрия начин за да се подкара кода, но така тръгна.

Поздрави.

1
Jovanna avatar Jovanna 79 Точки

Много благодаря! Успех утре!!

1