Kezdőoldal » Számítástechnika » Programozás » Mutató esetében miért nem...

Mutató esetében miért nem működik az operator++?

Figyelt kérdés

//main.cpp

# include <iostream> //std::cout,std::cin,std::cin.get,std::endl;

# include <string> //std::string;

# include <cstring> //strlen

# include <stdlib.h> //# define EXIT_SUCCESS 0;

# include <algorithm> //std::sort;

# include <windows.h> //Sleep(1000),exit(0)


typedef unsigned short ushort;

typedef unsigned int uint;


using std::cout;

using std::cin;

using std::endl;

using std::string;

using std::sort;



enum BREED {HASKI,TERRIER,PINCSI};


class Mammal

{

public:

Mammal();

Mammal(ushort age,ushort weight);

Mammal(const Mammal &rhs);

virtual ~Mammal();


const Mammal operator++(int) {++itsWeight;return *this;}


virtual void Speak()const {cout <<"Mammal beszel \n";}

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

void Sleep()const {cout <<"Mammal alszik \n";}


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

void SetWeight(ushort weight) {itsWeight = weight;}

ushort GetAge()const {return itsAge;}

ushort GetWeight()const {return itsWeight;}

protected:

ushort itsAge;

ushort itsWeight;

private:

};


class Dog: public Mammal

{

public:

Dog();

Dog(ushort age,ushort weight,BREED breed);

Dog(const Dog &rhs);

~Dog();


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


void Speak()const {cout <<"Dog beszel \n";}

void Sleep()const {cout <<"Dog alszik \n";}


void SetBreed(BREED breed) {itsBreed = breed;}

BREED GetBreed()const {return itsBreed;}

protected:

private:

BREED itsBreed;

};


Mammal::Mammal():

itsAge(2),

itsWeight(6)

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


Mammal::Mammal(ushort age,ushort weight):

itsAge(age),

itsWeight(weight)

{cout <<"Mammal ushort,ushort Konstruktor \n";}


Mammal::Mammal(const Mammal &rhs):

itsAge(rhs.GetAge())

{cout <<"Mammal copy konstruktor \n";}


Mammal::~Mammal()

{cout <<"Mammal Destruktor \n";}



Dog::Dog():

Mammal()

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


Dog::Dog(ushort age,ushort weight,BREED breed):

Mammal(age,weight),

itsBreed(breed)

{cout <<"Dog ushort,ushort,BREED Konstruktor \n";}


Dog::Dog(const Dog &rhs):

Mammal(rhs)

{cout <<"Dog copy konstruktor \n";}


Dog::~Dog()

{cout <<"Dog Destruktor \n";}



//main

int main()

{

Mammal *pMammal = new Dog;

pMammal->Clone();

pMammal++; //Futási hiba!



delete pMammal;

return EXIT_SUCCESS;

}


2012. jún. 7. 00:23
 1/4 anonim ***** válasza:
100%

Erre gondolsz: ?

Mammal *pMammal = new Dog;

pMammal->Clone();

pMammal++; //Futási hiba!


Nos, a mutató esetében a ++ operátor a mutató értékét növelné "eggyel", tehát a tárolt memóriacímet "tolná odébb" 1 egységgel. Ilyet pedig csak úgy nem szabad csinálni, mert olyan memóriaterületre hivatkoznál vele, amelybe nem piszkálhatsz bele, nincs hozzá jogod (az oprendszer nem engedi, egyébként sem tudjuk, hová mutatna a ++ után egy ilyen Mammal pointer).


Ha magára az objektumra akarod hívni a ++ operátort, akkor csináld így:


(*pMammal)++;

A zárójel nem biztos, hogy kell, már nem emlékszem pontosan a precendenciára, de ez így biztos jó, ahogy fent írtam.

2012. jún. 7. 00:54
Hasznos számodra ez a válasz?
 2/4 anonim ***** válasza:
100%

1. vagyok.

Amúgy, még annyit hozzáfűznék így látatlanban, hogy a könyv, amiből ezt tanulod, szerintem nem lehet valami jó. Persze fogalmam sincs, mert egyetlen C++-os könyvet sem olvastam el (maximum beleolvastam egybe), mert szerencsére elég jól adták le a anyagot 1 éve egyetemen.


Mindenesetre az is lehet, hogy egy másik könyv sokkal jobban elmagyarázná a dolgokat, és könnyebben megértenéd. Azért mondom, mert mintha lett volna egy pár kérdés, amit te tettél fel, és írtad is, hogy nehezen haladsz a könyvvel (bocs, ha nem te voltál).

2012. jún. 7. 01:13
Hasznos számodra ez a válasz?
 3/4 A kérdező kommentje:

Kösz a választ adtam zöld kezet.

Igen lehet,hogy nem ártana egy könyv csere.

De már nemsoká a végén vagyok aztán átveszem újra az egészet a Stroustup könyvéből.

2012. jún. 7. 01:38
 4/4 anonim ***** válasza:
A probléma igazából az, hogy a szülő osztály mutatója a szülő osztály méretével lépne arrébb, a gyermek osztály mérete azonban már más. Az objektumorientáltság egyik nagy problémája; ezt nem tudja megoldani.
2012. jún. 8. 15:36
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!