Pomoc przy listach (Programowanie Obiektowe)

0

Witam serdecznie.
Mój kod: https://pastebin.com/8EtXtq1X
Byłbym wdzięczny gdyby ktoś wyjaśnił jak z funkcji dodaj_zwierze wyciagnąć id, by zrobić nową funkcję, która dopisuje do listy, ale o id większym o 1 od poprzednika.
Np. Dodaje 3 zwierzęta (Psy), czyli ostatni ma id 3. Chcę dopisać 2 koty, by 1 kot miał id 4, a drugi 5.
Byłbym wdzięczny za sprawdzenie też funkcji sortującej i pomoc przy napisaniu funkcji edytujący dany element z listy.
To początki z listami, obiektowym programowaniem, więc staram się to zrozumieć. :)
PS. Byłbym wdzięczny też za polecenie źródeł z których zrozumiem programowanie obiektowe.

1

Dodaj do klasy Lista pole statyczne reprezentujące licznik elementów i na jego podstawie ustawiaj pole id zwierzaka (też je dodaj do klasy Lista)..
Licznik powinien być inkrementowany przy dodawaniu zwierza, a dekrementowany przy usuwaniu.
Z tą inkrementacją i dekrementacją to może nie do końca, bo usunięcie zwierzaka ze środka może namieszać w numerach. Może stwórz tablicę jako statyczny element klasy i w niej zapisuj wszystkie używane id.

0

Można jaśniej? Praktycznie jak dodaje normalnie to idzie normalnie id (1,2,3,4 czyli tyle ile dałem przy wpisywaniu ile chce dodać) tylko jak chce dodać jeszcze to licznik tak jakby się resetuje. na razie tak rozumiem problem. Wybacz, ale jestem początkujący w obiektówce. A niestety mój prowadzący mało ogarnięty i zamiast wytłumaczyć idzie dalej. :)

1

@carlosmay: Nie, nie, nie... Żadne statyczne elementy nie są potrzebne. W żadnym wypadku! Licznik może być po prostu polem klasy, a nie żadnym staticiem. Pole gwarantuje zachowanie jego wartości.~

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

struct element
{
    string name;
    unsigned id;
    element *next;
};

class linked_list
{
private:
    element *root;
    unsigned count;

public:
    linked_list() : root(nullptr), count(0){}

    void add(const string& name)
    {
        element *el = new element();
        el->name = name;
        el->id = count;
        el->next = this->root;
        this->root = el;
        this->count += 1;
    }

    unsigned getCount()
    {
        return this->count;
    }

    void print()
    {
        for(element *temp = this->root; temp != nullptr; temp = temp->next)
        {
            cout << "Id: " << temp->id << " Name: " << temp->name << "\n";
        }
    }

    ~linked_list()
    {
        element *temp = this->root;
        while(temp)
        {
            element *current = temp;
            temp = temp->next;
            delete current;
            current = nullptr;
        }
    }
};

int main(){
    linked_list list;
    list.add("Kot");
    list.add("Pies");
    list.add("Kret");
    list.add("Krowa");
    list.print();
    cout << "Count: " << list.getCount() << "\n";
    return 0;
}

A usuwanie rzeczywiście pomiesza indeksy ale trzeba je ponownie ponumerować np. od miejsca, w którym usunięto element do końca listy. W ogóle polecam jakąś dobrą książkę do C++, ponieważ używasz w swoim kodzie dziwnych rzeczy:

  • NULL to jest w C. W C++ jest nullptr;
  • Nazwy zmiennych jakoś oznaczaj po ludzku, a nie E, F itp. Człowiek czyta i nie wie do czego to jest;
  • stdlib.h wiedz, że na pewno nie potrzebujesz;
  • string.h z C? Ja już to cstring ale na pewno chodziło Ci o #include <string>;
  • Generalnie źle się to czyta, bo część jest po polsku, a część po angielsku. Staraj się jednak po angielsku pisać :)
  • Przekazujesz niektóre obiekty przez wartość zamiast przez referencje np: string Nazwa zamiast const string& nazwa. Tworzysz przez to niepotrzebną kopię. Wyobraź sobie teraz przekazanie jako argument dużej struktury w pętli. Ile niepotrzebnych kopii natworzysz?;
  • Niepotrzebnie przekazujesz takie rzeczy jak ofstream *plik przez wskaźnik. Przekaż to przez referencję, tak jak w punkcie wyżej napisałem. Oszczędzi Ci to błędów i niepotrzebnych użyć gwiazdek w ciele funkcji;
  • Dane z plików wczytuj do stringa, a nie do char text1[256].

Ponoć książka Stephena Prata jest dobra. Szkoła programowania czy jakoś tak.

0

Z praktycznego pkt widzenia to nie mój kod, a kolegi, który dostał od swojego prowadzącego, więc :P Można jakoś Cię złapać na gg, skype, facebooku lub coś?
nullptr? To czego nas uczą na studiach? :D

0

Można zamknąć temat. Dziękuje wszystkim

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