Dobrý den,
momentálně řeším problém týkající se práce s třídami. Pravděpodobně jsem při studiu OOP něco důležitého přehlédl, protože dlouhodobě bojuji s tím, jak mám z třídy vracet instanci privátního člena.
class Obal {
private:
Prvek prvek;
public:
Prvek getPrvek1() const { // 1
return this->prvek;
}
Prvek &getPrvek2() const {
return this->prvek;
}
Prvek *getPrvek3() const {
return &this->prvek;
}
}
Pokud bych chtěl z instance třídy Obal dostat vnitřní třídu Prvek, kterou z metod bych měl použít? V prvním případě se Prvek "překopíruje", takže bych ve výsledku neměnil vnitřní instanci.
Ve druhém případě pravděpodobně bude kompilátor skřehotat kvůli převodu z const Prvek na &Prvek.
Třetí případ dopadne stejně jako druhý. Problém s převodem const Prvek na *Prvek.
Ve třetím případě by se chyba odstranila smazáním const za jménem metody. To mi ale znemožní takovou metodu volat například v kopírovacím konstruktoru:
Obal::Obal( const Obal &original ) {
this->prvek = *original.getPrvek3();
}
Takže na jednu stranu potřebuju, aby metoda byla const - pro použití v kopírovacím konstruktoru, ale také, aby nebyla const - a mohl jsem volat nekonstantní metody třídy Prvek.
Jde o špatný návrh tříd? Dědění se mi v tomto případě zdá jako špatný nápad. Obal není speciálním případem Prvku, jen využívá jeho metod.
Jak se řeší podobné případy?
Děkuji.