Keresés

Új hozzászólás Aktív témák

  • Krono91

    csendes tag

    válasz emvy #2651 üzenetére

    Reggel amint lesz rá időm nekiesek és átnyálazom az erről szóló dolgokat.

    A többieknek csak hogy a hibát kicsit jobban specifikáljam:
    Ha a ListaElem konstruktorát kijavítom ez a kódrészlet nekem tökéletesen lefordul, de ha használni szeretném már nem tudom.
    Első gyors ránézésre azonnal feltűnik hogy a Lista konstruktorában mikor a strázsákat hozom létre a next és pre pointereket mintha nem definiáltam volna. tehát olyan mintha a a Lista osztály nem látná a ListaElem struktúra belső felépítését.

    A megoldás az lett hogy létrehoztam egy ListaElem.h headert és abba tettem bele ezt a kódrészletet:
    template <class Adat>

    class ListaElem // privát struktúra így nem kell a fiend ami nehezíti az olvashatóságot, és így tényleg senki nem fér hozzá ehhez az adattaghoz
    {
    friend class Lista;

    Adat data; // maga az adat része az objektumnak
    ListaElem *next; // a listában következőre mutató pointer
    ListaElem *pre; // a listában előzőre mutató pointer

    //ListaElem konstruktora, ezzel már azonnal beszúrhatóvá is válik 2 listaelem közé
    ListaElem(ListaElem *next = 0, ListaElem *prev = 0) :next(next), pre(prev) {}
    };

    A másik headerben a generikusság miatt egy kis átalakítással pedig ez maradt:
    #include "ListaElem.h"

    template<class Adat>
    class Lista
    {
    ListaElem<Adat> *first; // Első eleme a listának strázsa
    ListaElem<Adat> *last; // Utolsó eleme a listának strázsa

    public:
    //Lista konstruktora, strázsák létrehozása
    Lista()
    {
    //Strázsák létrehozása
    first = new ListaElem<Adat>;
    last = new ListaElem<Adat>;
    first->pre = 0;
    first->next = last;
    last->pre = first;
    last->next = 0;
    }
    };

    Ekkor már tökéletes a kód és használható is.
    A kérdés az hogy az első megoldásom miért nem helyes.
    El szeretném kerülni a friend class használatát és egy belső privát struktúrában szeretném tárolni a ListaElemek felépítését.

    Bocsánat ha ködösen fogalmaztam elsőre, de már tényleg lassan alvás idő van :D

  • Krono91

    csendes tag

    válasz Jester01 #2647 üzenetére

    Ebben igazad van azt már én is átírtam, a kód lefordul utána, de ha megnézed akkor nem lát bele a ListaElem struktúrába a Lista, és nem tudom miért... a favágó megoldás az most hogy külön headerben tárolom a ListaElemet, és friend class a Lista, így látja a privát adattagokat, és így már működik...
    De sajnos nem tudom a miértjét:S

  • Krono91

    csendes tag

    Hellosztok.

    Szeretném megtudni hogy ez a kódrészlet miért nem működik helyesen:
    template<class Adat>
    class Lista
    {
    struct ListaElem // privát struktúra így nem kell a friend ami nehezíti az olvashatóságot, és így tényleg senki nem fér hozzá ehhez az adattaghoz
    {
    Adat data; // maga az adat része az objektumnak
    ListaElem *next; // a listában következőre mutató pointer
    ListaElem *pre; // a listában előzőre mutató pointer

    //ListaElem konstruktora, ezzel már azonnal beszúrhatóvá is válik 2 listaelem közé
    ListaElem(ListaElem *next = 0, ListaElem *prev = 0) :n(next), p(prev) {}
    };
    ListaElem *first; // Első eleme a listának strázsa
    ListaElem *last; // Utolsó eleme a listának strázsa

    public:
    //Lista konstruktora, strázsák létrehozása
    Lista()
    {
    //Strázsák létrehozása
    first = new ListaElem;
    last = new ListaElem;
    first->pre = 0; // nem ismeri a fordító a pre pointert...
    first->next = last; // nem ismeri a fordító a next pointert...
    last->pre = first;
    last->next = 0;
    }
    }

    A problémám a Lista konstruktorával van, bele is kommenteltem a megakadásom okát.
    Elképzelhető hogy én vagyok nagyon fáradt és valmai triviális dolgot nem veszek észre de akkor sem látom, mi lehet a hiba.
    A segítséget előre is köszönöm :)

Új hozzászólás Aktív témák