Příklad z knížky Naučte se C++ za 21 dní.Volání Fce dvou tříd. – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Příklad z knížky Naučte se C++ za 21 dní.Volání Fce dvou tříd. – C / C++ – Fórum – Programujte.comPříklad z knížky Naučte se C++ za 21 dní.Volání Fce dvou tříd. – C / C++ – Fórum – Programujte.com

 

sait
~ Anonymní uživatel
4 příspěvky
3. 2. 2016   #1
-
0
-

Ahoj mám dotaz chci se naučit C++ už programuji Arduino což je podobné ,ale tak sem se nějak chtěl dozvědět o C++ .V knize výpis kapitoly 6.9. Zde se jedná o     Bod ZiskejHorniLevy()const {return hodnotaHorniLevy;} tohle vytvoří jako objekt nechápu co tím chtěl basník řící a jakto ,že můžu napsat MujObdelnik.ZiskejHorniLevy().ZiskejX();??? Má to něco společného s void NastavHorniLevy(Bod Umisteni) {hodnotaHorniLevy = Umisteni;} myslím hlavně ten zápis vytvářím něcím když napíšu Bod funkce něco nového.Nemohli by jste to nějak popsat v knize tenhle popis dost odbyli....

//zacatek Obdelnik.hpp

#include <iostream>
// udrzuje souradnice x a y jednoho bodu
class Bod
{
	// no construktor
	public:
		void NastavX(int x){ hodnotaX = x; }
		void NastavY(int y){ hodnotaY = y; }
		int ZiskejX()const { return hodnotaX;}
		int ZiskejY()const { return hodnotaY;}
		
	private:
		int hodnotaX;
		int hodnotaY;
			
};
class Obdelnik
{
	public:
	Obdelnik(int horni,int levy,int spodni,int pravy);
	~Obdelnik(){}
	int ZiskejHorni()const { return hodnotaHorni;}	
	int ZiskejLevy()const { return hodnotaLevy;}
	int ZiskejSpodni()const { return hodnotaSpodni;}
	int ZiskejPravy()const { return hodnotaPravy;}
	
	Bod ZiskejHorniLevy()const {return hodnotaHorniLevy;}
	Bod ZiskejSpodniLevy()const {return hodnotaSpodniLevy;}
	Bod ZiskejHorniPravy()const {return hodnotaHorniPravy;}
	Bod ZiskejSpodniPravy()const {return hodnotaSpodniPravy;}
	
	void NastavHorniLevy(Bod Umisteni) {hodnotaHorniLevy = Umisteni;}
	void NastavSpodniLevy(Bod Umisteni) { hodnotaSpodniLevy = Umisteni;}
	void NastavHorniPravy(Bod Umisteni) {hodnotaHorniPravy = Umisteni;}
	void NastavSpodniPravy(Bod Umisteni) { hodnotaSpodniPravy = Umisteni;}
	
	int ZiskejPlochu() const;
	
	private:
		Bod hodnotaHorniLevy;
		Bod hodnotaSpodniLevy;
		Bod hodnotaHorniPravy;
		Bod hodnotaSpodniPravy;
		int hodnotaHorni;
		int hodnotaLevy;
		int hodnotaSpodni;
		int hodnotaPravy;
		
};
//konec Obdelnik.hpp


//zacatek Obdelnik.cpp

//#include "Obdelnik.hpp"

Obdelnik::Obdelnik(int horni,int levy,int spodni,int pravy)
{

hodnotaHorni = horni;
hodnotaLevy = levy;
hodnotaSpodni = spodni;
hodnotaPravy = pravy;

hodnotaHorniLevy.NastavX(levy);
hodnotaHorniLevy.NastavY(horni);

hodnotaHorniPravy.NastavX(pravy);
hodnotaHorniPravy.NastavY(horni);

hodnotaSpodniLevy.NastavX(levy);
hodnotaSpodniLevy.NastavY(spodni);

hodnotaSpodniPravy.NastavX(pravy);
hodnotaSpodniPravy.NastavY(spodni);

}

int Obdelnik::ZiskejPlochu()const
{
int Sirka = hodnotaPravy - hodnotaLevy;
int Vyska = hodnotaHorni - hodnotaSpodni;
return (Sirka * Vyska);

}

int main()
{

Obdelnik MujObdelnik(100,20,50,40);
int Plocha = MujObdelnik.ZiskejPlochu();
std::cout << "\n Plocha: " << Plocha <<"\n";
std::cout << "\nSouradnice X horniho leveho Bodu je: " << MujObdelnik.ZiskejHorniLevy().ZiskejX();

return 0;

}
Nahlásit jako SPAM
IP: 212.80.67.–
ondrej39+1
Věrný člen
3. 2. 2016   #2
-
+1
-
Zajímavé

#1 sait
Tomu, co tě zajímá, se říká kompozice. Protože kompozice není úplně české slovo, je možné jej popsat jako skladbu, jako souhrn určitých věci dohromady.

I my lidé jsme určitou kompozicí, záleží na tom, jak se na člověka podíváš. Jedním z pohledů je například, že máš ruce, nohy, trup, hlavu a krk. Na rukou a nohou máš samozřejmě třeba prsty, nohy mají paty, ruce mají dlaně, lokty, atp. Samotné prsty pak mají nehty. Tímto způsobem bys vlastně mohl rozebrat úplně všechno.

Stejným způsobem je možné v programování rozebrat komplexní objekty až na úplně základní stavební kameny, jimiž jsou bity, to se ovšem často nedělá a tak se rozebírají pouze na základní datové typy, jak jsou char, integer nebo například double.

Když se v tvém příkladě podíváš na třídu Bod, můžeš si všimnout, že má čtyři veřejné metody, tj. metody, k nimž můžeš přistupovat pomocí tečkové '.' (pokud jednáš přímo s objektem na zásobníku) nebo šipečkové '->' notace (pokud jednáš s objektem, který je na haldě anebo pointerem na nějaký objekt).

Pokud si tedy vytvoříš bod, víš, že jeho informace můžeš získat nebo nastavovat právě pomocí těchto metod.

Bod mujBod;
mujBod.NastavX(10);
int x = mujBox.ZiskejX(); // do hodnoty x se uloží hodnota 10

V Bodě samotném jsou použity dvě proměnné skalárního typu, typu integer, a stejně jako je integer základní programovací typ, tak si po dokončení designu tvé třídy Bod můžeš představit Bod jako další takový datový typ, který umí uchovávat hned dvě hodnoty najednou.

Je logické, že obdélník se bude skládat ze čtyř bodů (má čtyři rohy). Takže obdélník je jen dalším datovým typem, který je ještě o řád komplexnější (složitější) než tebou vytvořený datový typ Bod, protože obdélník již v sobě dokonce uchovává zmíněné objekty typu Bod.

Co se samotného řetězení příkazů týče, představ si to opět na analogii člověka. Dejme tomu, že uvidíš nějakého muže a chceš zjistit, jakou barvu má jeho nehet (nyní podotýkám, že kód, který teď uvidíš není správny dle principů OO jazyků, ale protože si začátečník, nemá smysl se zabývat správností kódu na úrovni zapouzdření).

Ty předem víš, že abys znal barvu nehtu, potřebuješ znát prst, abys znal prst, potřebuješ znát dlaň, abys znal dlaň, pořebuješ znát paži (levou, nebo pravou) a abys znal paži, potřebuješ znát člověka a toho znáš. Můžeš tedy jít od hlavního objektu, člověka, postupně přes dané vlastnosti (paže -> dlaň -> malíček -> nehet -> barva), než se dostaneš ke kýžené vlastnosti.

Clovek jara("Jara Cimrman");
Barva barvaNehtu = jara.ZiskejLevouPazi().ZiskejDlan().ZiskejMalicek().ZiskejNehet().ZiskejBarvu();

Pokaždé, když jsi zavolal metodu ZiskejX jsi získal objekt určitého typu, ať to byla paže, dlaň nebo malíček. A tento typ byl zase poskládán z dalších stavebních kamenů, dalších objektů, díky nimž můžeš volat další a další metody.

Opakem tohoto řetězení metod za sebe je možnost přiřadit pokaždé výsledek metody do konkrétní proměnné a to takového typu, který daná metoda vrací, a na této nově vytvořené proměnné volat další metodu. Laická představa je přitom taková, že namísto abys u člověka prozkoumával jeho levou paži, následně dlaň, malíček, atp., tak vždycky danou zkoumanou část vložíš do přístroje, který je schopen kopírovat věci, které do něj vložíš, tuto část si zkopíruješ, aby neměla na původní celek vazbu a pak už zkoumáš jenom tuto nově zkopírovanou část o samotě a ani nevíš, že původně nějaký člověk byl.

Co se vytváření objektů týče, všimni si, že když máš člověka, tak abys získal barvu jeho nehtu u malíčku, nemusíš nutně vytvářet nový objekt a to člověka ani neudělá. Metoda ZiskejHorniLevy nevytváří nový objekt typu Bod, ale vrací ti objekt typu Bod, který je přímo svázaný s konkrétním objektem třídy Obdélník.

Nahlásit jako SPAM
IP: 79.141.243.–
Inject all the dependencies!
sait
~ Anonymní uživatel
4 příspěvky
3. 2. 2016   #3
-
0
-

#2 ondrej39
Díky za výstižnou analogii .Mám ještě dotazy ,abych se o něčem ujistil.

1 tohle je          Bod hodnotaHorniLevy;       

vytvořený  nový objekt uchovává X a Y

2, hodnotaHorniLevy.NastavX(levy); nastavuje tomuto objektu souřadnice

3     Bod ZiskejHorniLevy()const {return hodnotaHorniLevy;}

 vrací objekt tak jak jsi to popsal,

4,    void NastavHorniLevy(Bod Umisteni) {hodnotaHorniLevy = Umisteni;}

tady nevim o jaky pripad se jedná myslim Bod Umisteni

Jeste jednou dekuji snad tomu porozumím abych se dostal dál učím se i Arduino programování což je skoro taky C++ tak moc zkušeností nemám.

Nahlásit jako SPAM
IP: 212.80.67.–
KIIV
~ Moderátor
+43
God of flame
3. 2. 2016   #4
-
0
-

Jinak je zapotrebi jen jeden bod a dve strany. Vse ostatni se da velice snadno dopocitat. Kdyby to byly nejaky slozity vypocty, tak dejme tomu.

Nahlásit jako SPAM
IP: 94.113.92.–
Program vždy dělá to co naprogramujete, ne to co chcete...
sait
~ Anonymní uživatel
4 příspěvky
4. 2. 2016   #5
-
0
-

potřeboval bych poradit s otazkou č.4 jinak nejde o efektivito,ale o to že se to učím

Nahlásit jako SPAM
IP: 212.80.67.–
ondrej39+1
Věrný člen
4. 2. 2016   #6
-
0
-

#3 sait

1. Přesně tak. Nutné je ještě také si ujasnit, kdy konkrétně se daný bod vytvoří. A to je ve chvíli, kdy vytvoříš nový objekt typu Obdélník. Dokud tak neučiníš, nebude se vytvářet tento ani žádný další Bod, které jsou v obdélníku.

4. Bod Umisteni je Bod, ktery musíš vytvořit dříve, než ho předáš do metody NastavHorniLevy, a touto vytvořenou proměnnou přepíše aktuální hodnotu hodnotaHorniLevy. Opět na analogii člověka, představ si, že bych ti chtěl vyměnit nohu, nastavit ti nohu novou. Vytvořím si tedy nohu, nebo klidně vezmu nohu svoji, tvoji nohu utrhnu, přidělám na místo tvé původní nohy nohu novou a tu původní zahodím, protože ji už nepotřebuji.

2. a 3. otázku podle mě není třeba zodpovídat.

Nahlásit jako SPAM
IP: 78.156.159.–
Inject all the dependencies!
sait
~ Anonymní uživatel
4 příspěvky
6. 2. 2016   #7
-
0
-

a kdyvych volal funkciNastavHorniLevy(Bod Umisteni) s paramtery x a y jak bych je nastavil a ted myslím zapis jinak díky moc ,myslim že tohle v knize mělo být popsáno...

Nahlásit jako SPAM
IP: 212.80.67.–
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, 101 hostů

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ý