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.
//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;
}
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 ...
Í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;
}
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;
}
É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 ...
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:
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!
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!