Kezdőoldal » Számítástechnika » Programozás » Ezt hogyan kell megoldani? C++

Ezt hogyan kell megoldani? C++

Figyelt kérdés

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());


2012. szept. 16. 11:14
 1/8 A kérdező kommentje:
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?
2012. szept. 16. 11:19
 2/8 A kérdező kommentje:

Í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?

2012. szept. 16. 11:29
 3/8 A kérdező kommentje:

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());

2012. szept. 16. 11:37
 4/8 anonim ***** válasza:

"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".

2012. szept. 16. 15:14
Hasznos számodra ez a válasz?
 5/8 A kérdező kommentje:

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.

2012. szept. 16. 17:21
 6/8 A kérdező kommentje:

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?

2012. szept. 16. 17:26
 7/8 A kérdező kommentje:
Hopsz félre nyomtam kétszer bocsi.
2012. szept. 16. 17:28
 8/8 anonim ***** válasza:

"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.

2012. szept. 16. 23:54
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!