C++ Volání konstruktoru rodiče

Vývojová prostředí, aplikace, skripty, http://www... síťové programy, internet, sdílení...
Odpovědět
kybrex
Začátečník
Začátečník
Uživatelský avatar
Registrován: 16. dub 2006
Bydliště: V sudu... (plnej samozřejmě)
Kontaktovat uživatele:

C++ Volání konstruktoru rodiče

Příspěvek 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 :)
Nemáte oprávnění prohlížet přiložené soubory.

CPU: Intel Pentium (Prescott) 2,8GHz / 800MHz cache L1 16kB, L2 1MB; + CoolerMaster S9U1 Hyper TX MotherBoard: ASUS P5GD1PRO Intel 915P PCI-Express, GPU: ATI Radeon X700PRO 425MHz 128MB GDDR3 (860MHz), RAM: 2x256MB + 2x512MB 400MHz, HDD: Western Digital Caviar 320GB cache 16MB + Western Digital 1000GB 16MB cache, DVD mechanika: LG HL-DT-ST DVDRAM GSA-4082B writing: 8x DVD-R/+R, 4x DVD+RW/-RW, 3x DVD-RAM, 24x CD-R, 16x CD-RW reading: 12x DVD, 10x DVD-RW/+RW, 3x DVD-RAM, 32x CD. LCD: 19" AG Neovo F-419, CRT: 17" ADI Microscan M700, REPRO: Eltax concept 400 + Omnitronic P-250

NOTEBOOK:
Hewlett Packard 550 :: CPU: C2D T5270 @1,4GHz L2 Cache 2MB, FSB 800MHz, RAM: 2+2 GB DDR2 667 MHz, Chipset: Intel GME965, HDD: 160 GB 5400 RPM Serial ATA, DVD±RW, Komunikace: Modem 56 Kbit/s, 10/100 Mbit/s LAN Ethernet Controller, Wireless LAN 802.11a/b/g, BlueTooth
xxsawer
Začátečník
Začátečník
Registrován: 29. kvě 2007

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

Příspěvek 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...
kybrex
Začátečník
Začátečník
Uživatelský avatar
Registrován: 16. dub 2006
Bydliště: V sudu... (plnej samozřejmě)
Kontaktovat uživatele:

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

Příspěvek 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);
}

CPU: Intel Pentium (Prescott) 2,8GHz / 800MHz cache L1 16kB, L2 1MB; + CoolerMaster S9U1 Hyper TX MotherBoard: ASUS P5GD1PRO Intel 915P PCI-Express, GPU: ATI Radeon X700PRO 425MHz 128MB GDDR3 (860MHz), RAM: 2x256MB + 2x512MB 400MHz, HDD: Western Digital Caviar 320GB cache 16MB + Western Digital 1000GB 16MB cache, DVD mechanika: LG HL-DT-ST DVDRAM GSA-4082B writing: 8x DVD-R/+R, 4x DVD+RW/-RW, 3x DVD-RAM, 24x CD-R, 16x CD-RW reading: 12x DVD, 10x DVD-RW/+RW, 3x DVD-RAM, 32x CD. LCD: 19" AG Neovo F-419, CRT: 17" ADI Microscan M700, REPRO: Eltax concept 400 + Omnitronic P-250

NOTEBOOK:
Hewlett Packard 550 :: CPU: C2D T5270 @1,4GHz L2 Cache 2MB, FSB 800MHz, RAM: 2+2 GB DDR2 667 MHz, Chipset: Intel GME965, HDD: 160 GB 5400 RPM Serial ATA, DVD±RW, Komunikace: Modem 56 Kbit/s, 10/100 Mbit/s LAN Ethernet Controller, Wireless LAN 802.11a/b/g, BlueTooth
xxsawer
Začátečník
Začátečník
Registrován: 29. kvě 2007

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

Příspěvek 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 :)
Teuzz
Středně pokročilý
Středně pokročilý
Uživatelský avatar
Registrován: 25. zář 2004
Bydliště: Liberec, Praha
Kontaktovat uživatele:

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

Příspěvek 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();"
Burn in hell.
kybrex
Začátečník
Začátečník
Uživatelský avatar
Registrován: 16. dub 2006
Bydliště: V sudu... (plnej samozřejmě)
Kontaktovat uživatele:

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

Příspěvek 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.

CPU: Intel Pentium (Prescott) 2,8GHz / 800MHz cache L1 16kB, L2 1MB; + CoolerMaster S9U1 Hyper TX MotherBoard: ASUS P5GD1PRO Intel 915P PCI-Express, GPU: ATI Radeon X700PRO 425MHz 128MB GDDR3 (860MHz), RAM: 2x256MB + 2x512MB 400MHz, HDD: Western Digital Caviar 320GB cache 16MB + Western Digital 1000GB 16MB cache, DVD mechanika: LG HL-DT-ST DVDRAM GSA-4082B writing: 8x DVD-R/+R, 4x DVD+RW/-RW, 3x DVD-RAM, 24x CD-R, 16x CD-RW reading: 12x DVD, 10x DVD-RW/+RW, 3x DVD-RAM, 32x CD. LCD: 19" AG Neovo F-419, CRT: 17" ADI Microscan M700, REPRO: Eltax concept 400 + Omnitronic P-250

NOTEBOOK:
Hewlett Packard 550 :: CPU: C2D T5270 @1,4GHz L2 Cache 2MB, FSB 800MHz, RAM: 2+2 GB DDR2 667 MHz, Chipset: Intel GME965, HDD: 160 GB 5400 RPM Serial ATA, DVD±RW, Komunikace: Modem 56 Kbit/s, 10/100 Mbit/s LAN Ethernet Controller, Wireless LAN 802.11a/b/g, BlueTooth
Odpovědět

Zpět na „Programování a web“