Komunikace Tříd – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Komunikace Tříd – C / C++ – Fórum – Programujte.comKomunikace Tříd – C / C++ – Fórum – Programujte.com

 

Guga
~ Anonymní uživatel
7 příspěvků
3. 11. 2008   #1
-
0
-

Dobrý den,
Zajímalo by mě, jak zajistit aby dvě úplně odlišné třídy byly schopné přímo ovlivňovat navzájem svá soukromá data, aniž by ze sebe něco dědily atp... Je to možné?

Nahlásit jako SPAM
IP: 86.49.93.–
bukaj0
Věrný člen
3. 11. 2008   #2
-
0
-

Guga
jak zajistit aby dvě úplně odlišné třídy byly schopné přímo ovlivňovat navzájem svá soukromá data, aniž by ze sebe něco dědily
Určitě by to podle mě šlo pomocí pointerů. Ale zrovna moc dobré se mi to nezdá – odporuje to objektovému principu zapouzdření.

Nahlásit jako SPAM
IP: 85.70.13.–
Jak se správně ptát? -> http://www.hash.cz/inferno/otazky.html[br][br] Po programování je člověk hladovej.
Guga
~ Anonymní uživatel
7 příspěvků
3. 11. 2008   #3
-
0
-

Ještě jsem přemýšlel o "friend" třídách o kterých jsem si do té doby myslel, že přesně k tomu slouží, ale bohužel bez úspěchu.

Nahlásit jako SPAM
IP: 86.49.93.–
MaS0
Návštěvník
3. 11. 2008   #4
-
0
-

To Guga : proč bez úspěchu (vlož kód)??.....nejsem si jistej, ale řek bych, že se to tak nějak má udělat

Nahlásit jako SPAM
IP: 195.146.114.–
Mihulik0
Návštěvník
3. 11. 2008   #5
-
0
-

Nechci rýpat, ale:
-pokud se dostaneš do situace, kdy potřebuješ něco takového, tak je potřeba okamžitě zastavit a překopat návrh-prostě je "něco" špatně.
Pokud na tom trváš, tak se vykašli na OOP a piš to procedurálně. Nejhorší co můžeš udělat, je slátanina OOP a procedurálního programování dohromady. Buď jedno, nebo druhé...oboje dohromady ne!

Nahlásit jako SPAM
IP: 85.13.98.–
Guga
~ Anonymní uživatel
7 příspěvků
3. 11. 2008   #6
-
0
-

Chci mít program prostě přehlednější a ne mít tisíc věcí v jedné třídě, proto to chci rozdělit na různé třídy, ovšem zároveň potřebuji aby si návzájem třídy dokázaly měnit data... Nemyslím, že komunikace více tříd musí být hned "slátanina"-

Nahlásit jako SPAM
IP: 86.49.93.–
Wizard0
Stálý člen
3. 11. 2008   #7
-
0
-

To Guga : Ved prave pre tento pripad je vhodne dedenie. Preco ho nechces pouzit?

Nahlásit jako SPAM
IP: 85.216.182.–
Guga
~ Anonymní uživatel
7 příspěvků
3. 11. 2008   #8
-
0
-

Protože nechci nic z bázové třídy dědit, chci jen aby měli možnost komunikovat.
Kdybych např měl třídu člověk a třídu Dům, tak nechci aby Dům zdědil pohlaví, věk atp... ale přesto chci, aby Člověk např kdyby si lehl na postel, tak aby to přidalo něco jeho privátním datům.... (napadá mě např Comfort v The Sims atp...)

Nahlásit jako SPAM
IP: 86.49.93.–
3. 11. 2008   #9
-
0
-

Tak mej funkci ulozDoDomu u obyvatele, ktera ulozi do sve clenske promenne pointer na inicializovany objekt domu. Ten dum pak muze mit treba funkci ziskejData, ktera vrati pole zakladnich udaju o domu. Zadne odkazovani na clenske promenne neni treba.

Nahlásit jako SPAM
IP: 81.30.238.–
Prosím, jestli potřebujete s něčím poradit,zeptejte se na fóru. Jakýkoliv bezdůvodný pokus mě kontaktovat skončí okamžitým přidáním do ignore listu![br][br] Současný počet osob, které to nepochopily: 7
Wizard0
Stálý člen
3. 11. 2008   #10
-
0
-

To Guga : No tak pouzi 'friend class'. Priklad:



class Kruh;
class Troj {
void setR() {
Kruh k;
k.r = 5; // je to mozno lebo trieda 'Kruh' je nas kamarat :)
}
}

class Kruh {
public:
// z triedy 'Troj' budeme moct pristupovat k 'private' premennam a funkciam triedy 'Kruh'
friend class Troj;

private:
int r;
}

Nahlásit jako SPAM
IP: 85.216.182.–
Guga
~ Anonymní uživatel
7 příspěvků
3. 11. 2008   #11
-
0
-

To CommanderZ : Ano, něco podobného mě také napadlo, ale právě proto jsem se ptal zda neexistuje něco "jednoduššího":).
To Wizard :
Ano, ale když budu chtít pracovat s jinou konkrétní již vytvořenou třídou Kruh, tak to nepůjde, protože se vždy vytvoří "jiná" kružnice s názvem K.... zde vydím ten problém....
Asi mi nezbude než to udělat přes pointery a vracení hodnot :)

Nahlásit jako SPAM
IP: 86.49.93.–
MaS0
Návštěvník
3. 11. 2008   #12
-
0
-

To Wizard : no ale když mají ty třídy navzájem komunikovat, tak to je složitější, protože překladač musí znát obecnou deklaraci spřátelené třídy

class aa {

public:
friend class b;
aa() {a=0;};
int getA(){
return a;
}
void setA(int cislo){
a=cislo;
}
private:
int a;
};
class bb {
public:
friend class a;
bb() {b=0;};
int getB(){
return b;
}
void setB(int cislo){
b=cislo;
}
private:
int b;
};
class a :public aa {
public:
a ():aa() {}
int getBB(bb &b) {
return b.b;
}
void setBB(bb &b, int cislo) {
b.b=cislo;
b.setB(cislo);
}
};
class b :public bb {
public:
b ():bb() {}
int getAA(aa &a) {
return a.a;
}
void setAA(aa &a, int cislo) {
a.a=cislo;
a.setA(cislo);
}
};

teď spolu třídy aa a bb mohou měnit soukromá data pomocí tříd a a b...........není nějakej jednodušší způsob?

Nahlásit jako SPAM
IP: 195.146.114.–
Wizard0
Stálý člen
3. 11. 2008   #13
-
0
-

To Guga : Hmm, nejak nechapem o co Ti ide :). Tym ze si zadefinoval triedu 'Troj' ako friend class triedy 'Kruh' tak si dovolil triede 'Troj' aby mohla pristupovat k 'private' a 'protected' clenom. Pokial chces aby trieda 'Troj' upravila tieto cleny uz exizistujucej triedy 'Kruh' tak jednoducho:



void Troj::setParameter(Kruh *k) { // predavame pointer!
// praca s parametrami objectu 'k'
k->r = 10;
// ....
}

Nahlásit jako SPAM
IP: 85.216.182.–
KIIV
~ Moderátor
+43
God of flame
4. 11. 2008   #14
-
0
-

stejne nechapu proc se snazis o to primy hrabani do ciziho objektu ...
od ceho sou metody objektu... abys posilal zpravy objektu a ten se podle toho zaridil
jak uz tu padlo hrabani primo do promennych objektu je proti smyslu objektoveho programovani jako takoveho

Nahlásit jako SPAM
IP: 80.250.27.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Guga
~ Anonymní uživatel
7 příspěvků
4. 11. 2008   #15
-
0
-

To Wizard : Ano, toto je přesně to, co hledám :) - takhle jsem si představoval že by to mělo fungovat, děkuji moc :).

To KIIV : Proč by měla být komunikace tříd proti smyslu OOP? Proč něco dělat přes metody, když existují jednodušší způsoby? Myslím, že kdyby to bylo prot smyslu OOP, tak by to v C++ nebylo... Navíc stále nechápu proč by to mělo být proti smyslu? Smysl OOP jsou objekty, ovšem nikde se nepíše, že když si dva objekty mění návzájem data, tak že by to mělo být něco špatného - ba naopak, "Friend" classy jsou jedním ze základních věcí, stejně jako dědičnost, polymorfismus etc.

Nahlásit jako SPAM
IP: 86.49.93.–
KIIV
~ Moderátor
+43
God of flame
4. 11. 2008   #16
-
0
-

komunikace trid pomoci metod je v poradku..
ale hrabani do vnitrnich promennejch objektu je proti smyslu proc vubec objekty delat...

objekt se tedy pouziva pomoci vnejsich metod a programator se nemusi starat o to jak je to reseny uvnitr... (abstrakce)
krom toho kdyz vsechno nastavuje objekt, nemuze (v pripade ze je to dobre naprogramovane) dojit k takzvane "nekonzistentnosti dat" - tj nahrajes tam nejakou blbost, ktera ti sejme program nebo aspon pak nemuze fungovat korektne...

pokud chces prime nastavovani tak existujou struktury... je zbytecne to cpat do objektu


Nahlásit jako SPAM
IP: 80.250.27.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Wizard0
Stálý člen
4. 11. 2008   #17
-
0
-

To KIIV : Co myslis tym priamim hrabanim do promennych objektu? Ked tym myslis toto:



obj.premenna = 10;

tak by som nepovedal, ze je to proti zmysli OOP, je pravda, ze je dobrym zvykom vytvorit nejaku funkciu triedy ktora to spravy po pripade osetry vstup atd., ale proti zmyslu OOP to neni. (to je moj nazor)

Nahlásit jako SPAM
IP: 85.216.182.–
KIIV
~ Moderátor
+43
God of flame
4. 11. 2008   #18
-
0
-

To Wizard : toto se mi tezko posuzuje ... pokud je to public tak je to v klidu ... pokud jde o nejakou privatni promennou tak uz by to bylo docela mimo oop.. nebo nejaky pointery na ty skryte promenne :D

Nahlásit jako SPAM
IP: 80.250.27.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Wizard0
Stálý člen
4. 11. 2008   #19
-
0
-

To KIIV : Priame initalizovanie private premennych neni bezne, ale niekedy sa moze vyskitnut situaci kedy to je nutne. V podstate prave preto existuju friend class-y.

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

Podobná vlákna

Více tříd — založil RePRO

šablony u tříd — založil Kuge

Typy tříd apod. — založil Antonidas

Tvorba tříd a objektů — založil Tomas

Qt dědičnost tříd widgetů — založil apachenda

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ý