Kezdőoldal » Számítástechnika » Programozás » Jó így a memória foglalásom...

Jó így a memória foglalásom (c++)?

Figyelt kérdés

Van két osztályom egy ősosztály és egy gyerek osztály.


Helyet szeretnék foglalni nekik.


Akkor, ha ezt írom a main.cpp-be az jó?


Sportolo *s1 = new Sportolo;

Futo *f1 = new Futo;


(A sportolo az ős.)


Így szabadítom fel:


delete s1;

delete f1;



2016. márc. 18. 12:43
 1/7 anonim ***** válasza:
Ez így zsír király.
2016. márc. 18. 14:14
Hasznos számodra ez a válasz?
 2/7 anonim ***** válasza:
100%

Nem sikerült a legjobban feltenni a kérdést.

Nem derül ki, hogy azt szeretnéd-e tenni, amit a kód csinál, vagy csak félreértetted az öröklődést egy kicsit.


1. Ha szeretnél külön egy sportolót és külön(!) egy futót (ami egyúttal egy újabb sportoló is), akkor jó. Tehát ha mindkettőből szeretnél egy-egy példányt, akkor jó a kódod.


2. Ha csak egy futót szeretnél, aki egyben sportoló is, akkor a "new Sportolo" és "delete s1" tartalmú sorok feleslegesek, mert a Futo automatikusan Sportolo is.

2016. márc. 18. 14:58
Hasznos számodra ez a válasz?
 3/7 A kérdező kommentje:
Köszi szépen. Igazából az utóbbi verzió kellett. Most is tanuultam valamit :)
2016. márc. 18. 15:21
 4/7 anonim ***** válasza:
100%
Mostmár a biztonság kedvéért leírom, hogy amit te leírtál a memóriaterületet lefoglalja, de a konstruktort nem futtatja le. Az akkor történne meg, ha egy zárójelet is tennél a végére - new Futo();
2016. márc. 18. 15:57
Hasznos számodra ez a válasz?
 5/7 anonim ***** válasza:

#4:

Ez így nem egészen igaz. Az igaz hogy a kettő nem mindig ugyan az, de osztály és szabvány függő hogy melyik mit csinál. Általában ha van default konstruktor, mind a kettő meghívja azt. Ajánlom figyelmedbe a követező oldalt:


[link]

2016. márc. 18. 19:57
Hasznos számodra ez a válasz?
 6/7 anonim ***** válasza:

Igen, tudom, hogy nem teljesen van így, de figyelembe véve, hogy nem ismerjük az osztályok struktúráját biztonságosabb azt mondani, hogy nem inicializál semmit, és legfeljebb tévedni, mint nem mondani semmit :D


Meg egyébiránt ez pont egy olyan része a nyelvnek, amit nem sikerült még teljesen a fejembe vésnem.

2016. márc. 18. 20:11
Hasznos számodra ez a válasz?
 7/7 anonim válasza:

A memóriáról látom eddig nem volt szó... A mintában mindkét destruktor virtuális. Ez azért fontos mert, így az ősOsztálynak lefoglalt terület is felszabadúl, egyébként nem.


( A konstruktor és dest. azért írki ezt azt, hogy látszódjon mikor melyik fut le -> megfigyelhető, hogy míg az obijektum létrehozásakor ( = new Futo; ) a Sportolót követi a Futó; a megsemmisüléskor (delete senki / delete Bela) előbb a Futó, majd a Sportoló dest. fut le. )


Tanulság, a destruktorod mindig legyen virtuális. :) Baj nem lesz belőle várhatóan.


#include <iostream>


class Sportolo{


public:

Sportolo() {

std::cout << "Sportoló kész.\n";

}

virtual ~Sportolo() {

std::cout << "Sportoló törölve.\n";

}

};


class Futo : public Sportolo{


public:

Futo() {

std::cout << "Futó kész.\n";

}

virtual ~Futo(){

std::cout << "Futó törölve.\n";

}

};


int main()

{

Sportolo* valaki = new Sportolo;

Sportolo* senki = new Futo;

Futo* Bela = new Futo;


delete valaki;

delete senki;

delete Bela;


std::cout << "Vége\n";


return 0;

}

2016. márc. 24. 09:39
Hasznos számodra ez a válasz?

Kapcsolódó 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!