Polimorfizm, troche pokręcone zadanie

0

Cześć, jestem przy polimorfizmie. Dostałem od wykładowcy zadanie zaprogramować w C++ proste tak jakby radio. I funkcja info w klasie Radio ma byc niepubliczna, a w klasie RadioCD publiczna i samo w zależności od typu Radio lub RadioCD ma wybierać czy pokazać info z RadioCD czy z Radio. Jakby mógł ktoś zerknąć to będę wdzięczny :p Problem polega na tym że b.wyswietl() kompletnie nic nie pokazuje, jest tylko wyświetlone cout<<a; :D

 #include<iostream>
#include<string>
using namespace std;

class Radio
{
protected:
	string producent;
	int rozmiarpamieci, stacja;
	float *pamiec = new float[rozmiarpamieci];
	bool wlaczone;
	virtual void info()
	{
		if (wlaczone == 0)
			cout << "Radio jest wylaczone" << endl;
		else
			cout << stacja << ". " << pamiec[stacja] << "FM" << endl;
	}
public:
	Radio(string p, int rp);
	Radio(Radio &A);
	~Radio();
	void wylacz();
	void wlacz();
	void ustawstacje(int s);
	void zapamietajstacje(int s, float c);
	void wyswietl();
	void operator [] (int a);
	void operator +(float a);
	void operator ++();
	void operator --();
	friend ostream& operator <<(ostream& a, Radio& b);
	string zwrocproducenta();
};

class RadioCD :public Radio
{
	int ileUtworow, nrUtworu;
public:
	RadioCD(string p, int rp);
	RadioCD(Radio& a);
	void wlozPlyte(int a);
	void wyjmijPlyte();
	virtual void info();
};

int main()
{
	Radio a("sharp", 10);
	RadioCD b(a);
	a.wlacz();
	a.zapamietajstacje(0, 103.6);
	a.zapamietajstacje(1, 108.0);
	a.zapamietajstacje(2, 89.3);
	a.ustawstacje(0);
	a + 104.0;
	cout << a;
	b.wlozPlyte(5);
        b.wyswietl();
	system("pause");
	return 0;
}

Radio::Radio(string p, int rp)
{
	producent = p;
	rozmiarpamieci = rp;
	stacja = 0;
	for (int i = 0; i < rozmiarpamieci; i++)
	{
		pamiec[i] = 0;
	}
	wlaczone = 0;
}

Radio::Radio(Radio &A) :Radio(A.producent, A.rozmiarpamieci)
{}

void Radio::wylacz()
{
	wlaczone = 0;
}

void Radio::wlacz()
{
	wlaczone = 1;
}
Radio::~Radio()
{
	wylacz();
}

void Radio::ustawstacje(int s)
{
	if (s<0 || s>rozmiarpamieci)
		cout << "Zly numer stacji" << endl;
	else
		stacja = s;
}

void Radio::zapamietajstacje(int s, float c)
{
	if (s<0 || s>rozmiarpamieci)
		cout << "Zly numer stacji" << endl;
	if (c<83.0 || c>108.0)
		cout << "Zla czestotliwosc" << endl;
	else
		pamiec[s] = c;
}

void Radio::wyswietl()
{
	if (wlaczone == 1)
		info();
}

void Radio::operator [] (int a)
{
	if (a > rozmiarpamieci || a < 0)
		cout << "Zly indeks" << endl;
	else
		cout << pamiec[a] << endl;
}

void Radio::operator +(float a)
{
	for (int i = 0; i < rozmiarpamieci; i++)
	{
		if (i > rozmiarpamieci)
			cout << "Koniec pamieci" << endl;
		else
			if (pamiec[i] == 0)
			{
				pamiec[i] = a;
				break;
			}
	}
}

void Radio::operator ++()
{
	if (stacja++ > rozmiarpamieci)
		ustawstacje(0);
	else
	ustawstacje(stacja++);
}

void Radio::operator --()
{
	if (stacja-- < 0)
		ustawstacje(10);
	else
		ustawstacje(stacja--);
}

ostream& operator <<(ostream& a, Radio& b)
{
	a << b.zwrocproducenta() << endl;
	for (int i = 0; i < b.rozmiarpamieci; i++)
	{
		a << b.pamiec[i] << endl;
	}
	return a;
}

string Radio::zwrocproducenta()
{
	return producent;
}

RadioCD::RadioCD(string p, int rp) :Radio(p, rp)
{
	ileUtworow = 0;
	nrUtworu = 0;
}

void RadioCD::wlozPlyte(int a)
{
	ileUtworow = a;
	nrUtworu = 1;
}

void RadioCD::wyjmijPlyte()
{
	if (ileUtworow != 0)
	{
		ileUtworow = 0;
		nrUtworu = 0;
	}
}

void RadioCD::info()
{
	cout << nrUtworu << endl;
}

RadioCD::RadioCD(Radio& a) :Radio(a)
{

}

3
b.wlacz();
0

Gapa ze mnie, dzięki temat do zamknięcia :D

2

Tutaj:

float *pamiec = new float[rozmiarpamieci];

jest UB.

1 użytkowników online, w tym zalogowanych: 0, gości: 1