Manipulace se zapouzdřenými třídami – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Manipulace se zapouzdřenými třídami – C / C++ – Fórum – Programujte.comManipulace se zapouzdřenými třídami – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Lorin0
Návštěvník
25. 12. 2013   #1
-
0
-

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.

Nahlásit jako SPAM
IP: 89.190.72.–
vitamin+8
Grafoman
25. 12. 2013   #2
-
0
-

4 moznost:   :

const Prvek &getPrvek2() const {
	return this->prvek;
}
Nahlásit jako SPAM
IP: 95.105.152.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Lorin0
Návštěvník
25. 12. 2013   #3
-
0
-

A je možné na takto vrácený Prvek volat nekonstantní metody?

Nahlásit jako SPAM
IP: 89.190.72.–
Řešení
vitamin+8
Grafoman
25. 12. 2013   #4
-
0
-
Vyřešeno Nejlepší odpověď

#3 Lorin
Nie, ak chces volat aj nekonstantne metody tak musis urobyt kopiu premennej alebo vytvorit nekonstantny geter(pripadne dat premennu verejnu a vykaslat sa na getre)

Nahlásit jako SPAM
IP: 95.105.152.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Lorin0
Návštěvník
25. 12. 2013   #5
-
0
-

#4 vitamin

Nie, ak chces volat aj nekonstantne metody tak musis urobyt kopiu premennej

To neumožní editovat vnitřní instanci "zapouzdřené" třídy.

vytvorit nekonstantny geter

Jde vytvořit přetíženou metodu na základě toho, zda je const? Jednu pro kopírovací konstruktor a druhou pro získání nekonstantní reference pro použití "zvenčí".

pripadne dat premennu verejnu a vykaslat sa na getre

To vypadá jako možné řešení. Nicméně moje otázka stále trvá, není to, že řeším podobné problémy způsobeno špatným návrhem tříd a jejich vzájemné spolupráce?

Nahlásit jako SPAM
IP: 89.190.72.–
vitamin+8
Grafoman
25. 12. 2013   #6
-
+1
-
Zajímavé

#5 Lorin

Metoda moze byt pretazene na zaklade const:

#include <iostream>
#include <vector>

struct C{
	void fnc(){std::cout << "mutable\n";}
	void fnc()const{std::cout << "const\n";}
};

int main(){
	C c;

	c.fnc();
	reinterpret_cast<const C&>(c).fnc();
	return 0;
}

//vystup je:
mutable
const
Nahlásit jako SPAM
IP: 95.105.152.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Grungy0
Super člen
26. 12. 2013   #7
-
0
-

Ak toto všetko riešiš iba kvôli kopírovaciemu konštruktoru tak to môžeš jednoducho napísať takto:

Obal::Obal( const Obal &original ) {
	this->prvek = original.prvek;
}

a nepotrebuješ žiadne get metódy.

Nahlásit jako SPAM
IP: 188.123.100.–
Prvý náznak hlúposti, je pocit geniality.
Lorin0
Návštěvník
27. 12. 2013   #8
-
0
-

Ano v případě tříd, které mají být manipulovány i "zvenčí" bude nejjednodušší možností jejich přesun do "public" sekce.

viz. akceptovaná odpověď od #4 vitamin

pripadne dat premennu verejnu a vykaslat sa na getre

Nahlásit jako SPAM
IP: 89.190.72.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 7 hostů

Podobná vlákna

Manipulace s kuzrzorem — založil RadeCZech

Manipulace s JSON v PHP — založil marioDD

Prosba o pomoc s třídami — založil radaplech

Komunikace mezi třídami — založil rich

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý