Mutató esetében miért nem működik az operator++?
//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;
}
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.
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).
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.
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!