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;
}