Stránka 1 z 1

C++ Volání konstruktoru rodiče

Napsal: pát 22. kvě 2009, 10:26
od kybrex
Zdravím. Dělám úkol na PJC (programování v C++). Měli jsme za úkol navrhnout třídu Menu a k ní třídy Polozka a Submenu : Polozka (Submenu je potomkem polozky, má jen navíc ukazatel na první prvek spojového seznamu polozek). Hází mi to chybu , když volám různě konstruktory rodičů při spuštění konstruktoru potomka. Musí být u rodiče deklarován defaultní konstruktor bez parametrů? (V tomto případě je nesmyslný, protože při vytvoření položky usím znát název a id). Při kompilace g++ -Wall -Wno-long-long -pedantic mi to hází chyby:
gpp.JPG
Zde je potřebný úryvek kódu:

Kód: Vybrat vše

class Polozka
{
  private:
    int id;
    string name;
    Polozka * dalsi;
  protected:
    bool sm;
  public:    
   Polozka(int _id, string _name);
    Polozka(int _id, string _name,bool _sm);
    Polozka * getDalsi(void);
    void setDalsi(Polozka * p);
    virtual ~Polozka(void);
    int getID(void) const;
    string getName(void) const;
    virtual Polozka * existuje(int id);
    virtual string& vypis(string& out) const;
};

class Submenu : public Polozka
{
  private:
    Polozka * submenu;
  public:
    string& vypis(string& out) const;
    Polozka * existuje(int id);
    Submenu(int _id, string _name);
    ~Submenu(void);
    void vloz(Polozka * p);
    bool isSubm(void);
};

class Menu
{
  friend ostream& operator << (ostream&,const Menu&); //položky v submenu odsadit o 3 mezery
  private:
    Polozka * polozky;
    Polozka * existuje(int id) const;
    Polozka * getPolozka_Submenu(int id) const;
    Polozka * getPred(int id) const;
  public:
    Menu(void);
    ~Menu(void);
    bool vlozZa(int id, Polozka * p);
    bool vlozDo(int id, Polozka * p);//vložení do submenu ID
    bool odeber(int id);//při odebrání submenu odebrat i jeho položky
    bool najdi(int id, string& cesta) const;
};

//Polozka

Polozka::Polozka(int _id, string _name)
{
  id=_id;
  name=_name;
  sm=false;
  dalsi=NULL;
}

Polozka::Polozka(int _id, string _name,bool _sm)
{
  id=_id;
  name=_name;
  sm=_sm;
  dalsi=NULL;
}

Polozka::~Polozka()
{
  if(dalsi!=NULL) delete dalsi;
}

//konec polozky

//Submenu

Submenu::Submenu(int _id, string _name)
{
  Polozka::Polozka(_id,_name,true);
}

Submenu::~Submenu()
{
  if(submenu!=NULL) delete submenu;
  ~Polozka(); //smaze pamet polozky
}
Předem díky za tipy :)

Re: C++ Volání konstruktoru rodiče

Napsal: pát 22. kvě 2009, 12:11
od xxsawer
Ehm... v c++ se moc nevyznam tak to ber trochu s rezervou co pisu :) ale v Jave to je tak, ze kdyz volas konstruktor zdedeny tridy tak v tom konstruktoru zdedeny tridy musis jako prvni prikaz dat prikaz co bude volat konstruktor rodicovsky tridy. Kdyz ho tam nedas tak se vola implicitne konstruktor rodice bez parametru. No a kdyz ten neexistuje tak se ti to neprelozi...
Mozna to je zrovna tenhle pripad...

Re: C++ Volání konstruktoru rodiče

Napsal: pát 22. kvě 2009, 15:17
od kybrex
No to dělám nebo ne? :roll: Případně jsem nepochopil co je volat příkaz na prvním místě. V konstruktoru potomka volám hned jako první konstruktor rodiče. To není ono? (Protože ten implicitní konstruktor bez parametrů se mi tam opravdu volá, takže máš podle mě pravdu, ale nevím, co je tam špatně. Můžeš mi to napsat jak by to bylov javě (z tý mám hrubý základ, tak mi to z toho snad dojde). Díky

Kód: Vybrat vše

Submenu::Submenu(int _id, string _name)
{
  Polozka::Polozka(_id,_name,true);
}

Re: C++ Volání konstruktoru rodiče

Napsal: pát 22. kvě 2009, 17:06
od xxsawer
Nenzam syntaxi c++ takze sem napsal jenom tip... :oops:
Nevim co znamena treba tohle:

Kód: Vybrat vše

Polozka::~Polozka()
Ale proste z ty chyby co ti to hlasi:

Kód: Vybrat vše

Polozka::Polozka()
mi prijde, ze tam nekde volas konstruktor Polozka bez parametru...existuje takovej konstruktor?
Bud se odnekud vola sam protoze tam nekde nemas v konstruktoru potomka volani konstruktoru rodice nebo ho nekde volas primo ty...

Jinak to s tim volanim na prvnim miste sem napsal asi neobratne, ale pochopil si to spravne :)

Re: C++ Volání konstruktoru rodiče

Napsal: pát 22. kvě 2009, 17:23
od Teuzz
Polozka::~Polozka()

je deklarace destruktoru třídy Polozka

A to volání v tom kódu je šílený. Destruktor je něco, co se volá, když se na instanci dané třídy zavolá delete, používat to jako běžnou funkci je trochu mimo štábní kulturu, pokud chci sdílet obsah nějakých dvou funkcí, tak si udělám privátní metodu a tu pak z veřejné a destruktoru volám.

Nicméně tam dochází skutečně k volání bezparametrického konstruktoru třídy Polozka, problém je v tom, že chyba není v kódu, který jsi poslal - to volání pochází odjinud, někde máš "new Polozka();"

Re: C++ Volání konstruktoru rodiče

Napsal: sob 23. kvě 2009, 11:07
od kybrex
Prohlédnu to, kde se volá new Polozka, ale s tím voláním konstruktoru. Běžně to tak nedělám, vím, že se volá automaticky při příkazu delete na referenci na objekt, ale tady je to o tom, že rodič třídy submenu má ukazatel na přidělenou paměť a ten je mu privátní, aby objekt typu položka (rodič) měl přehled nad tím, kdy maže svou alokovanou paměť, nechci jí mazat nijakým způsobem z objektu typu submenu. Má to fungovat tak, že se zavolá delete submenu; a tím se vyvolá destruktor ~Submenu na objekt submenu a v tomto destruktoru je třeba zavolat ještě destruktor rodiče, aby smazal paměť, na kterou ukazuje zděděný ukazatel, nebo ne? Akorát bych asi měl to volání destruktoru přesunout na první místo.