sziasztok hogy lehetne az alábbi kódot működésre bírni úgy hogy kiveszem kommentből a destruktor tartalmát?
a kod:
#include
#include
using namespace std;
class Player{
private:
double *health;
string *name;
public:
Player(string, double);
Player(const Player &p);
~Player(){ /*delete health; delete name;*/ }
double getHealth();
Player operator+(Player& p) const;
void setHealth(double);
string getName();
void setName(string);
void playerInfo();
};
Player::Player(string Param1, double Param2)
{
name = new string;
health = new double;
*name = Param1;
*health = Param2;
}
Player::Player(const Player &p)
{
name = new string;
health = new double;
name=p.name;
health=p.health;
}
/*
Player::~Player()
{
}
*/
Player Player::operator+(Player& p) const
{
return Player(*name, *health+p.getHealth());
}
double Player::getHealth()
{
return *health;
}
void Player::setHealth(double Param1)
{
*health=Param1;
}
string Player::getName()
{
return *name;
}
void Player::setName(string Param1)
{
*name=Param1;
}
void Player::playerInfo()
{
cout << "Player info of player: " << *name << " Health:" << *health << "%" << endl;
}
int main (){
Player p1("Sarge", 100);
Player p2("Penguin", 80);
Player p3(p1);
p1.playerInfo();
p2.playerInfo();
p3=p1+p2;
p3.playerInfo();
return 0;
}
- 7031 megtekintés
Hozzászólások
az includeoknál iostream van és string, nem tudom miért nem pasteolta be...
- A hozzászóláshoz be kell jelentkezni
az includeoknál iostream van és string, nem tudom miért nem pasteolta be...
Azért nem, mert nem használtad a
code
elemet.
A programhoz:
double *health;
Nem akarsz lebegőpontos típust használni. Használj egy egészt, ahol a egységnyi különbség megfelel mondjuk egy tized- vagy századpontnak a játékban. (Fixpontos.)
Továbbá ilyen elemi típusra pointert bevezetni pocsékolás (tár- és CPU-).
Player(string, double);
A string-nél vegyél át inkább konstans referenciát, felesleges ilyenkor copy constructor-t futtatni.
~Player(){ /*delete health; delete name;*/ }
Majd lentebb látszik, hogy ez miért száll el.
Player::Player(const Player &p)
{
name = new string;
health = new double;
name=p.name;
health=p.health;
}
A fentiben a *this objektum mutatóit írod felül. A metódus végén a
*p.name
std::string-re, ill. a
*p.health
double-re két-két mutató fog mutatni. (A metódus elején allokált tár pedig elszivárog.) Amikor az egyik hivatkozó Player objektum megsemmisül, akkor annak a destruktora felszabadítja mind a string-et, mind a double-t, ezáltal érvénytelenné téve a másik Player objektum mezőit. Nevezett mezőknek ezután már a kiértékelése is definiálatlan.
- A hozzászóláshoz be kell jelentkezni
Sziasztok köszi a segítséget!
csak azért van ennyi baromság ebben mert egy olyan feladatot csinálok amiben rendre ezek az elemek benne kellenek legyenek és tudom, hogy sok baromság van benne és én sem csinálnék ilyet de ez van a feladatomban és szeretném valahogy egyszerűen megcsinálni sajnos a specifikációk ennyire nyomorékok. Tehát a kódban lévő dolgokat meg lehet változtatni, de copykonstruktor kell valamint operátor felüldefiniálás két Player összeadására ami abban nyilvánul meg, hogy az egyik nevét kapja az eredmény, viszont a health változóik összegződnek.
- A hozzászóláshoz be kell jelentkezni
Kíváncsi vagyok a specifikációra...
- A hozzászóláshoz be kell jelentkezni
legyen egy Player osztály ami tartalmazza egy Player nevét (char* vagy string), és az életerejét dinamukusan, legyen operator+ felülfdefiniálás ami két játékosnak összeadja az életerejét[...] és még sok operator felüldefiniálás ami nem e bejegyzés tárgya.:)
- A hozzászóláshoz be kell jelentkezni
szia!
Mivel dinamikus adattagokat hasznalsz akkor felul kellene irnod az assignment operatort is mert "mely" masolasra/deep copy-ra is szukseg lesz nem sekelyre.
http://www.learncpp.com/cpp-tutorial/912-shallow-vs-deep-copying/
Valoszinuleg ez a problemad a destruktorban. Ebben a sorban ** p3=p1+p2; ** Megosztod a dinamikus adattagokat, ez nem jo.
- A hozzászóláshoz be kell jelentkezni
na megoldva!! a string * egy őrültnagy baromság sima string vagy char* és zsírul megy!!
- A hozzászóláshoz be kell jelentkezni