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

Programowanie obiektowe - Polimorfizm, tablice wskaźników typu klasy bazowej

Object Storage Arubacloud
0 głosów
975 wizyt
pytanie zadane 18 stycznia 2017 w C i C++ przez Jedyn Obywatel (1,200 p.)

Witam. Piszę obecnie program Zeszyt. Napotkałem problem, którego nie wiem jak rozwiązać a mianowicie mam napisać funkcję wyświetl wyświetlającą informacje o Zeszytach (Klasa bazowa Zeszyt oraz pochodna ZeszytDwustronny). . Parametrami funkcji są: t - tablica wskaźników na obiekt typu Zeszyt oraz n - liczba elementów tablicy.
Link do zadania: https://www.docdroid.net/PQpZDmX/zeszyt.pdf.html
Po 1 nie wiem jak zadeklarować ten wskaźnik, ponieważ gdy próbuję stworzyć Zeszyt* t = new Zeszyt [t] to wywala mi na czerwono "Array of abstract class "Zeszyt" is not allowed: function "Zeszyt::IleZapisanych" is a pure virtual function" (wskaźnik Zeszyt* t = new ZeszytDwustronny[n] nie wywala błędu ale raczej to nie o to chodzi ). Rozumiem co to znaczy ale nie rozumiem dla czego tak się dzieje. Kolejną sprawą jest, jak uzupełniać tą funkcję. Z  tego co rozumiem mamy stworzyć taką funkcję, później mamy ją wywołać i podać wartość n po czym funkcja stworzy nam n-obiektów. Napisałem coś takiego: 

void wyswietl(int n)	// n-obiektow
{
	Zeszyt* t;
	t = new ZeszytDwustronny[n];
	for (int i = 1; i < n; i++)
	{	
		*(t++) =														//uzupelnianie tablicy, jak to zrobic?
	}
}

oraz cały kod:

 

#include "stdafx.h"
using namespace std;
class Zeszyt
{
public:
	Zeszyt(const int ile=32, int zapisaneOdPoczatku=0)
		:m_ileStr(ile)
	{
		if (zapisaneOdPoczatku > ile || ile<0)
		{
			cout << "Nie mozna zapisac wiecej niz liczba stron zeszytu lub liczba stron nie moze byc ujemna" << endl;
			system("pause");
		}
		else
			m_zapisaneOdPoczatku = zapisaneOdPoczatku;
		
	}
	int ileStron()
	{
		return m_ileStr;
	}
	int ileZapisanychOdPoczatku()
	{
		return m_zapisaneOdPoczatku;
	}
	virtual int IleZapisanych() = 0;
	Zeszyt & Zeszyt::operator+=(const unsigned int &right)
	{	
		if ((ileStron()-ileZapisanychOdPoczatku()) < right)
		{
			cout << "Nie mozna zapisac zapisanych stron" << endl;
			return *this;
		}
		
		m_zapisaneOdPoczatku += right;
		return *this;
	}
	virtual void wyswietl()
	{
		cout << "Zeszyt lacznie posiada stron: " << m_ileStr <<endl<<"Strony zapisane od poczatku: "<< m_zapisaneOdPoczatku <<endl;
	}



protected:
	const int m_ileStr;
	int m_zapisaneOdPoczatku;

};

class ZeszytDwustronny : public Zeszyt
{
protected:
	Zeszyt::m_ileStr;
	Zeszyt::m_zapisaneOdPoczatku;
public:

	ZeszytDwustronny(unsigned int zapisanychOdKonca=0, const int ile=96, int zapisaneOdPoczatek=0)
		:Zeszyt(ile, zapisaneOdPoczatek)
		{
		if (zapisanychOdKonca+zapisaneOdPoczatek > ileStron())
		{
			cout << "Bledne wartosci" << endl;
			system("pause");
		}
		else
		{
			m_zapisanychOdKonca = zapisanychOdKonca;
			m_zapisaneOdPoczatku = zapisaneOdPoczatek;
		}
		}
	int IleZapisanychOdKonca()			//ile od konca zapisanych 
	{
		return m_zapisanychOdKonca;
	}
	int IleZapisanych()
	{
		return (m_zapisanychOdKonca+m_zapisaneOdPoczatku) ;
	}
	ZeszytDwustronny & ZeszytDwustronny::operator-=(unsigned int &right)     //tutaj skonczylem
	{
		if (right<0)
		{
			right = 0;
			
			return *this;
		}
		if (m_zapisanychOdKonca <right && right>0 && right>=m_zapisaneOdPoczatku)
		{
			cout << "Nie mozna zapisac juz zapisanych stron" << endl;
			return *this;
		}
		m_zapisanychOdKonca += right;
		return *this;
	}
	virtual void wyswietl()															//ile stron zapisanych od konca (wyswietl z klasy bazowej)
	{
		Zeszyt::wyswietl();
		cout << "Stron czystych: " << m_ileStr - (m_zapisanychOdKonca+m_zapisaneOdPoczatku) << endl << "Stron zapisanych od konca: " << IleZapisanychOdKonca() << endl;
	}

private:
	unsigned int m_zapisanychOdKonca;
};

void wyswietl(int n)	// n-obiektow
{
	Zeszyt* t;
	t = new ZeszytDwustronny[n];
	for (int i = 1; i < n; i++)
	{	
		*(t++) =														//uzupelnianie tablicy, jak to zrobic?
	}
}



int main()	//unsigned int zapisanychOdKonca=0, const int ile=96, int zapisaneOdPoczatek=0
{
	Zeszyt* p1 = new ZeszytDwustronny(95, 96,1);
	p1->wyswietl();
	//Zeszyt* p2 = new Zeszyt(93,96,2);

	char k;
	cin >> k;
    return 0;
}

 

1 odpowiedź

+1 głos
odpowiedź 19 stycznia 2017 przez draghan VIP (106,230 p.)
wybrane 19 stycznia 2017 przez Jedyn
 
Najlepsza

Po 1 nie wiem jak zadeklarować ten wskaźnik, ponieważ gdy próbuję stworzyć Zeszyt* t = new Zeszyt [t] to wywala mi na czerwono "Array of abstract class "Zeszyt" is not allowed: function "Zeszyt::IleZapisanych" is a pure virtual function

Masz zadeklarować 4-elementową tablicę. Jeśli chcesz to zrobić klasycznym mechanizmem tablicowym, musisz to zrobić statycznie - dynamiczna alokacja tworzy obiekty, a obiektów klasy abstrakcyjnej utworzyć nie możesz.

Powinieneś stworzyć tablicę wskaźników na Zeszyt, a już kolejne komórki tablicy uzupełniać o pojedyncze obiekty klas pochodnych.

Zeszyt *t[4];
t[0] = new ZeszytDwustronny;

 

komentarz 19 stycznia 2017 przez draghan VIP (106,230 p.)

O, znikło. :)

Czyli muszę stworzyć jeszcze jedną funkcję która będzie te tablice wypełniała tak? A w wyświetl tylko je wyświetli.

Tak, dokładnie. Albo możesz wypełniać tablicę w main. ;)

komentarz 19 stycznia 2017 przez Jedyn Obywatel (1,200 p.)
Staram się edytować w miarę możliwości (piszę szybciej niż myślę). Jeszcze raz dzięki wielkie za pomoc :)
komentarz 19 stycznia 2017 przez Jedyn Obywatel (1,200 p.)
Jeszcze takie szybkie pytanie. Jak mam teraz nadać wartości nowo utworzonym obiektom?

EDIT. Już wiem wszystko działa :)
komentarz 19 stycznia 2017 przez draghan VIP (106,230 p.)

Przy ich tworzeniu (konstruktor) lub zdefiniować metody ustawiające odpowiednie pola obiektu i po utworzeniu całej tablicy obiektów je modyfikować.

Przykład pierwszej metody (niestety pętla może odpaść jeśli chcesz spersonalizować każdy obiekt z osobna):

int main()
{
     Zeszyt *t[4];
     t[0] = new ZeszytDwustronny(0, 15, 10);
     t[1] = new ZeszytDwustronny(0, 16, 9);
     t[2] = new ZeszytDwustronny(0, 20, 1);
     t[3] = new ZeszytDwustronny(1, 10, 0);
}

 

komentarz 19 stycznia 2017 przez draghan VIP (106,230 p.)
W razie wątpliwości - pisz. ;)

Na tę chwilę uciekam spać - życzę dobrej nocy.

Podobne pytania

0 głosów
1 odpowiedź 683 wizyt
0 głosów
1 odpowiedź 202 wizyt
0 głosów
5 odpowiedzi 1,935 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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!

...