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é?
Fórum › C / C++
Komunikace Tříd
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í.
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!
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"-
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...)
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.
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;
}
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 :)
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?
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;
// ....
}
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
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.
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
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)
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
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
š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