• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak uzyskać dostęp do obiektów na liście - c++

Cloud VPS
0 głosów
235 wizyt
pytanie zadane 27 marca 2021 w C i C++ przez Pabllo26 Obywatel (1,280 p.)

Kiedy próbuję wykonać poniższy kod widzę dwa błędy
1. error: 'std::__cxx11::list<record*>::iterator {aka struct std::_List_iterator<record*>}' has no member named 'pc'|
2. error: 'std::__cxx11::list<record*>::iterator {aka struct std::_List_iterator<record*>}' has no member named 'hInt'|
Z góry dzięki za odpowiedź

 

#include <iostream>
#include <list>
#include <string>
using namespace std;

class record
{
    public:
    string pc;
    int hInt;
};
list<record*> dictionary;
string text,p,pc;
char c;

int numberInDictionary;

int findOnList(string pc)
{
  static int num=1;
  for(list<record*>::iterator i = dictionary.begin(); i!=dictionary.end(); ++i)
  {
     if(*i.pc = pc)
     {
         return *i.hInt;
     }
  }
  return 0;
}

int main()
{
    bool isPConList=false;
    cin>>text;
    for(int i=0; i<text.length(); i++)
    {
        do
        {
            c = text[i];
            if(i==0)
            {
                p=c;
            }
            pc = p + c;

        }
        while(isPConList);
    }
    return 0;
}

 

1 odpowiedź

0 głosów
odpowiedź 27 marca 2021 przez adrian17 Mentor (354,560 p.)
wybrane 27 marca 2021 przez Pabllo26
 
Najlepsza

`i` to iterator.

`*i` to to na co wskazuje iterator, czyli `record*`.

A jak masz wskaźnik na record, to żeby dostać pole `pc`, potrzebujesz albo kolejne *, albo -> .

Więc

(*i)->pc
// lub
(**i).pc

Natomiast...

1. czemu w ogóle taka pętla po iteratorach zamiast normalnej pętli po kontenerze:

for(record *ptr : dictionary)

2. czemu przechowujesz <record*> zamiast po prostu <record>

3. czemu std::list, który prawie zawsze jest złym wyborem? Czemu nie vector lub - skoro nazwałeś "dictionary" to podręcznikowy typ słownikowy - (unordered_)map<string, int>?

komentarz 27 marca 2021 przez Pabllo26 Obywatel (1,280 p.)
edycja 27 marca 2021 przez Pabllo26
3. Głównie dlatego że nie wiedziałem że tak się da.
Po zmianie na (*i)->pc mam błędy error: base operand of '->' has non-pointer type 'record'|
komentarz 27 marca 2021 przez adrian17 Mentor (354,560 p.)
To... coś źle wpisałeś? Pokażesz?
komentarz 27 marca 2021 przez Pabllo26 Obywatel (1,280 p.)
int findOnList(string pc)
{
  static int num=1;
  for(list<record>::iterator i = dictionary.begin(); i!=dictionary.end(); ++i)
  {
     if((*i)->pc = pc)
     {
         return (*i)->hInt;
     }
  }
  num++;
  return 0;
}

 

komentarz 27 marca 2021 przez adrian17 Mentor (354,560 p.)
Cały, bo widzę że pozmieniałeś więcej.

Jeśli teraz trzymasz list<record>, to oczywiście `(*i)->pc` z powrotem nie ma sensu bo nie masz już podwójnej warstwy iterator->wskaźnik.

A, no i `==` jest do porównywania.
komentarz 27 marca 2021 przez Pabllo26 Obywatel (1,280 p.)
przywróciłem list<record*> i działa dzięki wielkie

Podobne pytania

0 głosów
2 odpowiedzi 311 wizyt
0 głosów
1 odpowiedź 504 wizyt
0 głosów
1 odpowiedź 181 wizyt
pytanie zadane 8 lutego 2021 w PHP przez mat19 Obywatel (1,580 p.)

93,482 zapytań

142,414 odpowiedzi

322,761 komentarzy

62,894 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...