Ezt hogyan kell megoldani? C++
Van 2 osztályom az egyik osztályomban példányosítva van adattagként a másik osztály egy példánya.
pl.
class A {};
class B {A a;}
Ha hozzárendelek egy B típusú objektumot egy másik B típusú objektumhoz akkor meghívódik a b operator= je.
És ebben az operator egyenlőben érjem el az A típus adattagját?
Nem tudom elmagyarázni.
Van két osztályom amikor meghívódik J osztály operator= je akkor meg kéne hogy hívódjon K osztály operator= je mert J osztályban létrehoztuk K egy példányát.
De ezt nem tudom megcsinálni.Muszáj meghívódnia mert akkor pár adattag nem fog felülíródni.
vagy a másik megoldás ha J osztály operator= ben másolom át a K osztály adattagjait.
Hogyan kell.
Ez az operator = ben van.
(*this).(*i_DogMove).i_setSpeed(rhs.(*i_DogMove).i_getSpeed());
Így is átmásolhatnám a cDog operator= ben:
this->i_DogMove->i_setSpeed(rhs.i_DogMove->i_getSpeed());
De szerintem jobb volna ha megtudnám hívni a cDog operator = ben a cMove operator= jét.
Ezt hogyan?
Már tudom,hogyan de nem jó úgy sem mert a cMove operator egyenlőnek argumentumként egy cDog-ot kéne várnia de így nem akarom meg így nem is lenne jó mert a cMove osztály még a cDog osztály előtt van definiálva és így cMove nem lássa a cDog típust.
Azt hiszem marad az a megoldás,hogy a cDog operator= ből elérem a cMove adattagját és úgy másolom át az értéket.
Egyébként meg a cDog osztályon kívül sosem fogok példányosítani egy cMove objektumot sem,akkor szerintem ez így jó megoldás lenne:
this->i_DogMove->i_setSpeed(rhs.i_DogMove->i_getSpeed());





"Ha hozzárendelek egy B típusú objektumot egy másik B típusú objektumhoz akkor meghívódik a b operator= je.
És ebben az operator egyenlőben érjem el az A típus adattagját"
Nem tudom mit értesz hozzárendelés alatt.Egy B típusú objektum nem tartalmazhat B típusú objektumot adattagként.
Egy osztályból egy másik osztály adattagjának a babrálását inkább mellőzzük.
Értelmetlenül túlbonyolítottnak tűnik:
(*this).(*i_DogMove).i_setSpeed(rhs.(*i_DogMove).i_getSpeed(
));
Jópár dolog zavaros ...
Vagyis hogyan valósítsam meg mindkét osztály operator = jét ha az egyik osztály rendelkezik a másik egy példányával?
Úgy hogy tudja minden osztály hogy hogyan kell lemásolni egy példányát. Az az objektum amelyik adattagként van egy másik objektumba akkor arra csak meghívjuk a = értékadó operátort és tudnia kell hogy hogy kell lemásolni. Sok esetben automatikusan jól működik, ha nincsenek pointerek.
pl: [link]
B tartalmazza A-t és A tudja hogy kell lemásolni önmagát ha B arra "kéri".
Sikerült kösz adtam zöld kezet.
Az én megoldásom is helyes volt de a tiéd szebb.
Még egy valamit nem bírok felfogni.
A te példádban az A osztály operator= ében ugye felesleges megvizsgálni hogy a bal oldalon levő obj címe egyenlő e a jobb oldali címével.
Sikerült kösz adtam zöld kezet.
Az én megoldásom is helyes volt de a tiéd szebb.
Még egy valamit nem bírok felfogni.
A te példádban az A osztály operator= ében ugye felesleges megvizsgálni hogy a bal oldalon levő obj címe egyenlő e a jobb oldali címével,mert ha a B osztályban egyenlő bal oldal jobb oldallal akkor valójában az A osztályban is egyenlő. IGAZ EZ?





"A te példádban az A osztály operator= ében ugye felesleges megvizsgálni hogy a bal oldalon levő obj címe egyenlő e a jobb oldali címével,mert ha a B osztályban egyenlő bal oldal jobb oldallal akkor valójában az A osztályban is egyenlő. IGAZ EZ?"
Akkor ha olyan B-t veszünk mely A-ban van akkor egyenlő.
Az én példámban felesleges vizsgálni mert minek? Ha egyenlő mind2 címe akkor a = jel mindkét oldalán ugyan az az objektum van ekkor önmagára másolná, konzisztens maradna. Igazából a példámba ha nem írtam volna meg a = operátorokat akkor is helyesen lemásolná, az lenne amit a fordító készített automatikusan = operátort.
"Az én megoldásom is helyes volt de a tiéd szebb."
A tied az nagyon csúnya, hiába csinálja azt amit kell. Azzal a módszertannal nagyon csúnyán el lehet veszíteni az uralmat a kód felett. Előveszed 1 hónap múlva más osztály adattagjaként is felveszed, akkor oda is kell, sőt csinálsz 10 osztályt aminek adattagja az a másik osztály akkor mindbe bele kell írni:
(*this).(*i_DogMove).i_setSpeed(rhs.(*i_DogMove).i_getSpeed(
));
Változtatsz az osztályon mind a 10 másik osztályba helyen át kell írni a = operátort. Kiderül rosszul írtad át mind a 10 helyen újra ki kell javítani, egy helyen kimarad valami ... Az OOP alap elveit nem tartod be. Pedig rengeteg hibalehetőséget kizárna.
További kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!