Kezdőoldal » Számítástechnika » Programozás » Miért nem jó? Virtualis...

Miért nem jó? Virtualis függvények.

Figyelt kérdés

//main.cpp

# include <iostream>


typedef unsigned short ushort;

typedef unsigned int uint;

using namespace std;



class Mammal {

public:

Mammal() { cout <<"Mammal Konstruktor \n"; }

Mammal(const Mammal &rhs);

virtual ~Mammal() { cout <<"Mammal virtual Destruktor \n"; }


virtual Mammal* Copy()const { return new Mammal(*this); }

void SetAge(short age) { itsAge = age; }

short GetAge()const { return itsAge; }

protected:

short itsAge;

private: };



class Dog: public Mammal {

public:

Dog(): Mammal() { cout <<"Dog Konstruktor \n"; }

Dog(const Dog &rhs);

virtual ~Dog() { cout <<"Dog virtual Destruktor \n"; }


virtual Mammal* Copy()const { return new Dog(*this); }

protected:

private: };



Mammal::Mammal(const Mammal &rhs): itsAge(2) {

cout <<"Mammal copy Konstruktor \n"; }


Dog::Dog(const Dog &rhs): Mammal(rhs) {

cout <<"Dog copy Konstruktor \n"; }



int main() {

const Mammal *const pMammal = new Dog;

Mammal *pArray[1] = pMammal->Copy();


return 0; }


2012. jún. 11. 18:53
 1/10 A kérdező kommentje:

//main.cpp

# include <iostream>


typedef unsigned short ushort;

typedef unsigned int uint;

using namespace std;



class Mammal {

public:

Mammal() { cout <<"Mammal Konstruktor \n"; }

Mammal(const Mammal &rhs);

virtual ~Mammal() { cout <<"Mammal virtual Destruktor \n"; }


virtual Mammal* Copy()const { return new Mammal(*this); }

void SetAge(short age) { itsAge = age; }

short GetAge()const { return itsAge; }

protected:

short itsAge;

private: };



class Dog: public Mammal {

public:

Dog(): Mammal() { cout <<"Dog Konstruktor \n"; }

Dog(const Dog &rhs);

virtual ~Dog() { cout <<"Dog virtual Destruktor \n"; }


virtual Mammal* Copy()const { return new Dog(*this); }

protected:

private: };



Mammal::Mammal(const Mammal &rhs): itsAge(2) {

cout <<"Mammal copy Konstruktor \n"; }


Dog::Dog(const Dog &rhs): Mammal(rhs) {

cout <<"Dog copy Konstruktor \n"; }



int main() {

const Mammal *const pMammal = new Dog;

Mammal *pArray[1] = pMammal->Copy();


delete [] pArray; /*Üres [] jelezzük,hogy az egész tömb tartalmát törölni szeretnénk és nem csak a tömb első elemét.*/


return 0; }


//error: array must be initialized with a brace-enclosed initializer|

2012. jún. 11. 19:04
 2/10 iostream ***** válasza:

Pontosan ez: //error: array must be initialized with a brace-enclosed initializer


Mammal *pArray[1] = pMammal->Copy();

A brace enclosed azt jelenti, hogy {}-be van zárva.

Ha azt írom, hogy

int array[1] = 1;

az szerinted helyes? Most tömböt vagy intet hozok létre?



Amúgy ez hibás:

/*Üres [] jelezzük,hogy az egész tömb tartalmát törölni szeretnénk és nem csak a tömb első elemét.*/


delete-t hívni delete[] helyett undefined behavior, jó esetben csak törli az első elemet, és békénhagyja a tömböt, rossz esetben formázza a merevlemezt, és elküldi a gyerekpornó képeidet az fbi-nak.

2012. jún. 11. 19:12
Hasznos számodra ez a válasz?
 3/10 A kérdező kommentje:

iostream kielégítőbb választ is adhatnál.

Te csak le írod,hogy nem jó és kérdezgetsz.

A megoldás meg sehol.

2012. jún. 11. 19:18
 4/10 A kérdező kommentje:

int main() {

const Mammal *const pMammal = new Dog;

Mammal *pArray[1] = {pMammal->Copy()};



return 0; }


Így már jó de a deletes gondot már nem értem.

Az a memóriacím ami bekerül a mutató tömbbe az egy dinamikus memóriában levő objektumra mutat.


Azok nem szabadulnak fel maguktól csak ha véget ér a program az én esetemben igen most véget ér de szeretném megírni a felszabadítását is.


Azt pedig így kell:

delete [] pArray; //Mi a rossz ebben nem értem.

delete pArray; //Így is jó mert csak egy eleme van a tömbnek.

2012. jún. 11. 19:23
 5/10 iostream ***** válasza:

"Azt pedig így kell:

delete [] pArray; //Mi a rossz ebben nem értem.

delete pArray; //Így is jó mert csak egy eleme van a tömbnek."


Csak azt akartam mondani, hogy a delete pArray NEM JÓ. Te úgy gondolod, hogy csak törli az első elemet, pedig nem, bármi megtörténehet, undefined behavior.

2012. jún. 11. 19:54
Hasznos számodra ez a válasz?
 6/10 A kérdező kommentje:

De hát akkor az okosok által írt könyv rosszat mond?

A könyv szerint ez az egész tömb tartalmát törli nem csak az első elemet:

delete [] pArray; //ugye mert ezzel jelezzük [],hogy az egész tömb tartalmát törölni szeretnénk.


Így pedig csak az első elemét töröljük:

delete pArray

2012. jún. 11. 20:00
 7/10 A kérdező kommentje:

"Te úgy gondolod, hogy csak törli az első elemet, pedig nem, "


Akkor a könyv hülyeséget ír?

Akkor ez mit csinál ha nem az első elemét törli

delete pMammal;

2012. jún. 11. 20:03
 8/10 A kérdező kommentje:

beugrott valami lehet hogy már értem.

De azon a memóriacímen ami a tömbbe van az dinamikusan létrehozott objektumra mutat.

Akkor ez a program tartalmaz egy nagy memória elszivárgást mert nem tudom törölni ezt az objektumot.


return new Dog(*this); //itt hozom létre dinamikusan és ennek az újonnan dinamikusan létrehozott objektumnak a visszatérési értéke egy memóriacím ami erre az objektumra mutat.


És ez a memóriacím kerül bele a pArrayba.

2012. jún. 11. 20:12
 9/10 A kérdező kommentje:
Hogyan töröljem a dinamikus memóriából azt az objektumot amit a Dog Copy függvénye hozott létre?
2012. jún. 11. 20:16
 10/10 anonim ***** válasza:
undefined behavior magyarázatára ment a zöld kéz :DDD
2012. jún. 12. 23:39
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, 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!