Kezdőoldal » Számítástechnika » Programozás » Mi a hiba ebben a c++ kódban?...

Mi a hiba ebben a c++ kódban? Nincs hibaüzenet lefordul csak amikor elindítom ki írja, hogy, hibát észlelt és leáll.

Figyelt kérdés

//main.cpp

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

# include <string> //std::string,strcpy,strncpy

# include <cstring> //strlen

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

# 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 {TERRIER,PINCSI,HASKI,BULLDOG};


class Mammal

{

public:

Mammal();

Mammal(ushort age,ushort weight); //konverzios konstruktor

Mammal(const Mammal &rhs);

~Mammal();

const Mammal& operator=(const Mammal &rhs);


const Mammal& operator++(); //prefix

const Mammal operator++(int); //postfix

const Mammal operator+(const Mammal &rhs); //operator+

operator ushort()const {return(ushort(*itsAge));} //konverzios operator


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

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

ushort GetAge()const {return *itsAge;}

ushort GetWeight()const {return *itsWeight;}


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

void Move()const {cout <<"Mammal odeb lepett \n";}

void Move(ushort move)const {cout <<"Mammal "<< move <<" lepest tett \n";}


protected:

ushort *itsAge;

ushort *itsWeight;

private:

};



class Dog: public Mammal

{

public:

Dog();

Dog(BREED breed);

Dog(ushort age);

Dog(ushort age,ushort weight);

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

Dog(const Dog &rhs);

~Dog();

const Dog& operator=(const Dog &rhs);


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

BREED GetBreed()const {return *itsBreed;}


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

void Move()const {cout <<"Dog lepett \n";}

void BegForFood()const {cout <<"Dog kajaert kuncsorog \n";}

void Wagtail()const {cout <<"Dog a farkat csovalja \n";}


protected:

private:

BREED *itsBreed;

};



Mammal::Mammal():

itsAge(new ushort(2)),

itsWeight(new ushort(4))

{cout <<"Alapertelmezett mammal konstruktor \n";}


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

itsAge(new ushort(age)),

itsWeight(new ushort(weight))

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


Mammal::Mammal(const Mammal &rhs)

{

cout <<"Mammal copy konstruktor \n";

itsAge = new ushort;

itsWeight = new ushort;

*itsAge = rhs.GetAge();

*itsWeight = rhs.GetWeight();

}


Mammal::~Mammal()

{

cout <<"Mammal destruktor \n";

delete itsAge;

delete itsWeight;

itsAge = NULL;

itsWeight = NULL;

}


const Mammal& Mammal::operator=(const Mammal &rhs)

{

cout <<"Mammal operator= \n";

if(this==&rhs)

return *this;

delete itsAge;

delete itsWeight;

itsAge = new ushort;

itsWeight = new ushort;

*itsAge = rhs.GetAge();

*itsWeight = rhs.GetWeight();

return *this;

}


const Mammal& Mammal::operator++()

{

cout <<"Mammal operator++ prefix \n";

++(*itsAge);

return *this;

}


const Mammal Mammal::operator++(int)

{

cout <<"Mammal operator++ postfix \n";

const Mammal Temp(*this);

++(*itsAge);

return Temp;

}


const Mammal Mammal::operator+(const Mammal &rhs)

{

cout <<"Mammal operator+ \n";

return Mammal(*itsAge+rhs.GetAge(),*itsWeight+rhs.GetWeight());

}


Dog::Dog():

Mammal(),

itsBreed(new BREED(TERRIER))

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


Dog::Dog(BREED breed):

Mammal(),

itsBreed(new BREED(breed))

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


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

Mammal(age,weight),

itsBreed(new BREED(TERRIER))

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


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

Mammal(age,weight),

itsBreed(new BREED(breed))

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


Dog::Dog(const Dog &rhs)

{

cout <<"Dog copy konstruktor \n";

itsBreed = new BREED;

*itsBreed = rhs.GetBreed();

}


Dog::~Dog()

{

delete itsBreed;

itsBreed = NULL;

}


const Dog& Dog::operator=(const Dog &rhs)

{

if(this==&rhs)

return *this;

delete itsBreed;

itsBreed = new BREED;

*itsBreed = rhs.GetBreed();

return *this;

}



//main

int main()

{

Mammal *Family = new Mammal[3];

Mammal *FamilyTwo = new Dog[3];

Dog FamilyThree[3];


Family[0].Speak();

Family[0].Move();

FamilyTwo[2].Speak(); //Itt áll le.

FamilyTwo[2].Move();

FamilyThree[1].Speak();

FamilyThree[1].Move();


FamilyTwo[1].Move(4); //Itt elfedjük a Move(ushort) függvényt ?????


delete [] Family;

delete [] FamilyTwo;


return EXIT_SUCCESS;

}


2012. máj. 24. 19:07
 1/7 anonim ***** válasza:

Mivel virtual kulcsszóval ellátott metódust használsz . operátor helyett -> operátor kell, ahhoz hogy -> operátort használhasd & operátor is kell.

(&FamilyTwo[0])->Speak();

A többi helyen is:

(&FamilyTwo[2])->Move();


(&FamilyThree[1])->Speak();

(&FamilyThree[1])->Move();


(&FamilyTwo[1])->Move(4); //Itt elfedjük a Move(ushort) függvényt ?????


Végül is itt mindenhol át lehet írni . operátort a -> operátorra.

delete [] (Dog*)FamilyTwo; a helyes delete használlat.


Tiszta alacsony szintű gagyizás,a forráskódba mechanikus string cserék tudhatná a fordító magától ezeket ...

2012. máj. 24. 20:41
Hasznos számodra ez a válasz?
 2/7 A kérdező kommentje:

Így sem jó:

int main()

{

Mammal *Family = new Mammal[3];

Mammal *FamilyTwo = new Dog[3];

Dog FamilyThree[3];


Family[0].Speak();

Family[0].Move();


(&FamilyThree[1])->Speak();

(&FamilyThree[1])->Move();

//(&FamilyThree[1])->Move(4); hiba elfedjük a Move(ushort) függvényt.


(&FamilyTwo[2])->Speak();

(&FamilyTwo[2])->Move();



delete [] Family;

delete [] (Dog*)FamilyTwo;


return EXIT_SUCCESS;

}

2012. máj. 24. 21:51
 3/7 A kérdező kommentje:

Még így is hibás lefordul csak futás közben axe hibát észlel és leáll.

int main()

{

Mammal *Family = new Mammal[3];

Mammal *FamilyTwo = new Dog[3];

Dog FamilyThree[3];


Family[0].Speak();

Family[0].Move();


(&FamilyThree[1])->Speak();

(&FamilyThree[1])->Move();

//(&FamilyThree[1])->Move(4); //hiba elfedjük a Move(ushort) függvényt.


(&FamilyTwo[2])->Speak();

(&FamilyTwo[2])->Move();



delete [] (Mammal*)Family;

delete [] (Dog*)FamilyTwo;


return EXIT_SUCCESS;

}

2012. máj. 25. 03:15
 4/7 A kérdező kommentje:
Írjatok már arogáns bu*ik.
2012. máj. 27. 17:00
 5/7 anonim ***** válasza:

Épp ezért nem ír senki mert ilyen vagy, sértegeted aki próbál(t) segíteni illetve akitől segítséget vársz, pedig te nézted félre azt a bizonyos dolgot (ezeket már törölték a moderátorok).

Ilyen hozzáállással nem neked való a programozás, ezen kívül ilyen stílus, romlott mentális állapot valószínűsíthető , pszichológus segítsége kéne neked.

Hidd el ilyen stílus nem kifizetődő számodra. Már rég kaptál volna választ, ha normális/intelligens emberi hangnembe fogalmaznál és látszódna hogy próbálkoztál a megoldással ...

2012. máj. 27. 18:10
Hasznos számodra ez a válasz?
 6/7 A kérdező kommentje:

Próbálkoztam már nagyon sokat de amúgy eltaláltad mert lelkileg nagyon kivagyok.

Ha valaki megszánna egy kis segítséggel akkor ide feltöltöttem a kódot:

[link]

2012. máj. 27. 18:28
 7/7 anonim ***** válasza:

Legyél optimistább lenni, próbálj a jóra gondolni, pl hogy itt most vki segít neked.

Dinamikus tömböket ilyen módon nem szoktam használni és igen soká esett le a tantusz nekem.

A probléma az hogy a c++-beli tömb szerkezete miatt van.

A 0.-ik elem oké mert nincs eltolás, az 1.-ik elem kezdőcíme a 0.-ik elem után helyezkedik el a 2.-ik az első után sor folytonosan.

A Mammal típusú objektum mérete nem egyezik a Dog típusú objektuméval.

A new Dog[3] létrehoz egy 3 elemű tömböt melybe Dog-ok vannak, majd Mammal tömbként kezeled, más eltolási címeket vesz mint kéne mivel a Dog objetum mérete nem egyezik a Mammal objektum méretével.

A két memóriacímet kivonva egymásból megkapható az eltolási cím 2 egymást követő tömbelem között:

cout << (char*)(&FamilyTwo[1])-(char*)(&FamilyTwo[0]) << endl;

cout << (char*)(&FamilyThree[1])-(char*)(&FamilyThree[0]) << endl;


Vagyis így NE használjunk dinamikus tömböket c++-ban!

2012. máj. 27. 20:32
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!