Tworzenie listy na podstawie innej klasy

0

Próbuje napisać program, którego treść zamieszczam w załączniku (jest na dole posta).

Jednak tam, gdzie mam kod w komentarzach pokazuje błędy:

#include <iostream>
#include <list>

using namespace std;


namespace kartoteka
{
    class Osoba
    {
        string name, surname;

    public:
        Osoba(string imie, string nazwisko)
        {
            this->name = imie;
            this->surname = nazwisko;
        }
    };
}

namespace mockup
{
    using namespace kartoteka;

    class Kartoteka
    {
    public:
        Kartoteka()
        {
        }

        void dodaj(Osoba ktos)
        {
        }

        void usun(Osoba ktos)
        {
        }

        int rozmiar()
        {
            return 1;
        }

        bool czyZawiera(Osoba ktos)
        {
            return true;
        }

        Osoba* pobierz(int index)
        {
            Osoba *osoba = new Osoba("Gall","Anonim");
            return osoba;
        }

    };
}

namespace impl
{
    using namespace kartoteka;

    class Kartoteka
    {
        list <Osoba> lista;

    public:
        void dodaj(Osoba ktos)
        {
            lista.push_back(ktos);
        }

        void usun(Osoba ktos)
       {
//            lista.remove(ktos);
       }

        int rozmiar()
        {
            return lista.size();
        }

        bool czyZawiera(Osoba ktos)
        {
            for(int i = 0; i < lista.size() ; ++i)
            {
//                return lista[i] == ktos;
            }
        }

        Osoba pobierz(int index)
        {
            if(lista.size())
            {
//                return lista[index];
            }
        }
    };
}

using namespace impl;

int main()
{
    Kartoteka kartoteka;
    Osoba ziom("Tomek","Duzy");
    kartoteka.dodaj(ziom);

    return 0;
}
 
0

No i czego niby oczekujesz? Że będziemy ci cytować dokumentacje czy jak? o_O
Zacznij od http://www.cplusplus.com/reference/list/list/ i zobaczysz że na przykład nie ma tam operatora[] więc siłą rzeczy lista[index]; nie ma sensu. Lista to zresztą nie vector więc nie pozwala na dostęp do dowolnego elementu. Nie ma tam też metody remove a jest erase.
Poza tym dla swojej klasy Osoba nie zdefiniowałeś operatora== więc skąd program ma wiedzieć jak takie porównanie wykonać?
Rozumiem że wydaje ci się że można próbować skompilować kod napisany w javie za pomocą kompilatora c++? ;]

0
  1. http://www.cplusplus.com/reference/list/list/remove/
    Remove usuwa wszystkie elementy tablicy równe podanej wartości. W Twojej implementacji brakuje przeciążenia operatora == dla klasys Osoba

  2. Tu są dwa błędy, pierwsz taki sam jak poprzednio. Drugi: funkcja zwróci true tylko jeżeli pierwszy element jest true.
    Powinno wyglądać to tak:

for(int i =0; i < lista.size() ; ++i){
    if(lista[i]==ktos)
        return true;
}
return false;
  1. Lista nie posiada operatora []. Możesz użyć
*std::next(lista.begin(), index);

nie jest to ładne, ale na początek chyba musi wystarczyć. Po drugie, w tym ifie nie chodziło Ci o if(lista.size() > index)

? Co zwróci funkcja jeżeli ktoś poda element z poza zakresu?
0

Będę próbować poprawiać. W tym programie lepszym wyborem byłby wektor ?

0

Tutaj na razie nie ma programu, tzn nie robi to wielkiej różnicy. Jak opanujesz jak używać obu struktur, wtedy dopiero zacznij się zastanawiać na wydajnością, ponieważ z tego co widać jeszcze masz przed sobą długą drogę :)
Jeżeli chcesz się czegoś nauczyć, to najlepiej napisz najpierw na liście, a jak już skończysz to przerób na vector. Utrwalisz sobie zarówno jak wybrać i-ty element listy oraz jak usunąć wybrany element vectora.

0

Mam coś takiego, ale nie wiem jak zrobić aby odwoływać się do konkretnych elementów listy:

#include <iostream>
#include <list>

using namespace std;


namespace kartoteka
{
    class Osoba
    {
        string name, surname;

    public:
        Osoba(string imie, string nazwisko)
        {
            this->name = imie;
            this->surname = nazwisko;
        }

        bool operator==(const Osoba &wzor)
        {
            if(wzor.name == name && wzor.surname == surname)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    };
}

namespace mockup
{
    using namespace kartoteka;

    class Kartoteka
    {
    public:
        Kartoteka()
        {
        }

        void dodaj(Osoba ktos)
        {
        }

        void usun(Osoba ktos)
        {
        }

        int rozmiar()
        {
            return 1;
        }

        bool czyZawiera(Osoba ktos)
        {
            return true;
        }

        Osoba* pobierz(int index)
        {
            Osoba *osoba = new Osoba("Gall","Anonim");
            return osoba;
        }

    };
}

namespace impl
{
    using namespace kartoteka;

    class Kartoteka
    {
        list <Osoba> lista;

    public:
        void dodaj(Osoba ktos)
        {
            lista.push_back(ktos);
        }

        void usun(Osoba ktos)
       {
            lista.remove(ktos);
       }

        int rozmiar()
        {
            return lista.size();
        }

        bool czyZawiera(Osoba ktos)
        {
            for(int i = 0; i < lista.size() ; ++i)
            {
                if(lista[i] == ktos)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }

        Osoba pobierz(int index)
        {
            if(lista.size() > index)
            {
               return ?
            }
        }
    };
}

using namespace impl;

int main()
{
    Kartoteka kartoteka;
    Osoba ziom("Tomek","Duzy");
    kartoteka.dodaj(ziom);
    kartoteka.usun(ziom);
    cout << kartoteka.rozmiar();

    return 0;
}
 
0

Jeżeli twoim kontenerem jest lista, to odwoływanie się do jej elementów przez indeks to istna głupota.

@tadzik287 opowiadając na komentarz: Bardzo skomplikowane. tj:

vector<Person> people = { ... };
Person p1 = people[6];
Person p2 = people.at(7); //bounds check
0

Czy da się prościej napisać funkcje która usuwa daną osobę z wektora ?

 void usun(Osoba ktos)
       {
            for(int i = 0; i < lista.size(); ++i)
            {
                if(lista.at(i) == ktos)
                {
                    lista.erase(lista.begin() + i);
                    break;
                }
            }
       } 
0
lista.erase(std::remove(lista.begin(), lista.end(), ktos), lista.end());

1 użytkowników online, w tym zalogowanych: 0, gości: 1