• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z C++ (chyba z pamięcią)

Object Storage Arubacloud
0 głosów
158 wizyt
pytanie zadane 4 grudnia 2015 w C i C++ przez timati Bywalec (2,060 p.)

Witam,

Poniżej przedstawiam mój kod. Pierwsza klasa dobrze działa i wszystko się wyświetla lecz przy drugiej występuje błąd. Screen dodany. Proszę o jakąkolwiek podpowiedz.

BŁAD:

http://pokazywarka.pl/cbv97e/

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

class Postac
{
protected:
	string nick;
	string serwer;
	int lvl;
public:
	Postac() {};
	Postac(string nick, string serwer, int lvl) {
		this->nick = nick;
		this->serwer = serwer;
		this->lvl = lvl;
	}
	void ruch() {
		cout << "Poruszam sie..." << endl;
	}
	virtual void przedstawSie() {
		cout << "Gram na serwerze " << serwer << " o nicku " << nick << " i mam " << lvl << "lvl" << endl;
	}
	~Postac() = default;
};


class Bron :virtual public Postac
{
protected:
	string nazwa;
	float obrazenia;
	float szybkosc;
public:
	Bron() {};
	Bron(string nazwa, float obrazenia, float szybkosc) :Postac(nick, serwer, lvl) {
		this->nazwa = nazwa;
		this->obrazenia = obrazenia;
		this->szybkosc=szybkosc;
	}
	void atak() {
		cout << "Atakuje... " << endl;
	}
	virtual void pokazBron() {
		cout << "Nazwa broni : " << nazwa << "szybkość : " << szybkosc << "obrazenia " << obrazenia << endl;
	}
	virtual void przedstawSie() {
		Postac::przedstawSie();
	}
	virtual ~Bron() = default;

};



int main() {


	Postac* postac = new Postac("Andrzej", "Fenix", 78);
	cout << "Postac" << endl;
	postac->przedstawSie();
	Bron* bron = new Bron("Szeroki Miecz", 45, 44);
	cout << "Bron" << endl;
	//bron->pokazBron();
	bron->przedstawSie();

	system("PAUSE");
	return 0;
}

 

3 odpowiedzi

0 głosów
odpowiedź 4 grudnia 2015 przez MetGang Nałogowiec (34,360 p.)

Patrząc na Twój kod i błąd std::bad_alloc chodzi zapewne i użycie new. Moje uwagi:

1. Pierwsze widzę coś w stylu: "class Bron :virtual public Postac", zmieniłbym na "class Bron : public Postac", to słówko virtual jest tu niepotrzebne.

2. Destruktor klasy bazowej/niższej powinien być wirtualny, a nie klasy dziedziczącej/wyższej. "~Postac() = default; virtual ~Bron() = default;" zamienić na "virtual ~Postac() {}; ~Bron() {}; (ewentualnie virtual ~Bron() {}; jeśli chcesz dalej dziedziczyć".

3. ":Postac(nick, serwer, lvl)" skąd pozyskujesz te zmienne?

4. Brak delete.

Reszta w porządku.

komentarz 4 grudnia 2015 przez Grzyboo Nałogowiec (28,860 p.)
virtual w dziedziczeniu klasy znaczy tyle, że gdy klasa dziedziczy z dwóch klas jednocześnie, a te z kolei dziedziczą po jednej klasie nadrzędnej to zostanie stworzona tylko jedna kopia tej nadrzędnej. Bezużyteczne pewnie tutaj, ale usuwać nie musi.
komentarz 4 grudnia 2015 przez timati Bywalec (2,060 p.)
1. Dodaje virtual bo to jest bardziej pod prowadzącego. Zarzyczył sobie więc ma.

2. O tym zapomniałem, dzięki :)

3. W konstruktorze

4. W którym miejscu ?
komentarz 4 grudnia 2015 przez MetGang Nałogowiec (34,360 p.)

1. Skoro tak to spoko, tylko zażyczył ;)

3. W konstruktorze broni masz zmienne o nazwie: nazwa, szybkosc, obrazenia; przesyłasz te o nazwie: nick, serwer, lvl

4. Wtedy kiedy przestajesz ich używać, czyli zazwyczaj na kończu programu przed return.

0 głosów
odpowiedź 4 grudnia 2015 przez Magicone Nałogowiec (45,100 p.)
Obrona przed przeciekami pamięci? Z tego co pamiętam, to zaalokowaną pamięć się oddaje, gdy nie jest Ci już potrzebna...
0 głosów
odpowiedź 4 grudnia 2015 przez criss Mędrzec (172,590 p.)

Po co używasz wirtualnego dziedzieczenia? Sam nigdy czegoś takiego nie widziałem, ale poszukalem i... tobie to jest zupełnie zbędne. https://en.wikipedia.org/wiki/Virtual_inheritance Używa się go wypadku opisanego w linku "diamentowego dziedzieczenia".

Destruktory wystarczy, że zostawisz puste (zdefiniowane, ale bez ciała).

Wirtualny destruktor powinien być w klasie z której się dziedziczy, nie w tej która dziedziczy. U ciebie akurat nie ma potrzeby, żeby jakikolwiek destruktor był wirtualny, ale nie zaszkodzi i warto się przywzwyczajać. Tutaj wyjaśnione dlaczego: http://www.coderscity.pl/ftopic33725-0-asc-10.html&sid=e33018fa1cabcac7d19e9adc715dbc93

 

Podobne pytania

0 głosów
2 odpowiedzi 617 wizyt
pytanie zadane 25 października 2015 w C i C++ przez Mateep Użytkownik (850 p.)
0 głosów
2 odpowiedzi 291 wizyt
pytanie zadane 12 października 2015 w C i C++ przez Mateep Użytkownik (850 p.)
0 głosów
1 odpowiedź 196 wizyt

92,567 zapytań

141,420 odpowiedzi

319,616 komentarzy

61,953 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...