Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Agregacja i dostanie się do pól obiektu

Ostatnio zmodyfikowano 2015-01-22 15:53
Autor Wiadomość
xast
Temat założony przez niniejszego użytkownika
Agregacja i dostanie się do pól obiektu
» 2015-01-21 17:01:50
Witam.

Napisałem taki schemat klas:
Wolumen - klasa abstrakcyja
Ksiazka - klasa dziedziczy po Wolumenie
Bibliteka - klasa zawiera tablice obiektów typu 'Ksiazka'

Nie mogę sobie poradzić, by napisać metodę w klasie Biblioteka, która 'dobiera się' do pól klasy Ksiazka. Oto kody poszczególnych klas:

C/C++
#include "stdafx.h"
#include "stdlib.h"
#include <iostream>

using namespace std;


class Ksiazka; // deklaracja zapowiadająca

class Biblioteka {
   
public:
    Ksiazka * spis[ 4 ];
    void dodajKsiazke( Ksiazka & ksiazka );
    void pokazKsiazke();
};

void Biblioteka::dodajKsiazke( Ksiazka & ksiazka ) {
    spis[ 0 ] = & ksiazka;
    /* Ksiazka wskaznikpomocniczy = &spis;
    wskaznikpomocniczy = ksiazka;*/
}

void Biblioteka::pokazKsiazke() {
    cout << "Autor :" << spis[ 0 ]->getAutor(); // TUTAJ WYSKAKUJE BŁAD o treści: "error C2027: use of undefined type 'Ksiazka' oraz 'error C2227: left of \->getAutor' must point to class/struct/union/generic type"
   
}

C/C++
class Wolumen {
protected:
    char tytul[ 30 ];
    char autor[ 40 ];
    int iloscStron;
    int cena;
   
public:
    int getCena() { return cena; };
    int getIloscStrin() { return iloscStron; };
    char * getTytul() { return tytul; };
    char * getAutor() { return autor; };
    virtual void spojrzNaWolumen() = 0;
};

C/C++
class Ksiazka
    : public Wolumen
{
public:
    Ksiazka( char * tytul, char * autor, int ilosc_stron, int cena );
    virtual void spojrzNaWolumen();
    void looknijNaKsiazke( Ksiazka ksiega );
};
Ksiazka::Ksiazka( char * tyt, char * aut, int ilosc_stron, int cena ) {
    strcpy( tytul, tyt );
    strcpy( autor, aut );
    this->iloscStron = iloscStron;
    this->cena = cena;
}
void Ksiazka::spojrzNaWolumen() {
    cout << "Jest to ksiazka o tytule: " << getTytul();; // + ksiazka.getTytul()  << endl;
   
}
void Ksiazka::looknijNaKsiazke( Ksiazka ksiega ) {
    cout << "Jest to ksiazka o tytule: " << ksiega.getTytul();
}

Błąd wyrzucany przez kompilator:
'error C2027: use of undefined type 'Ksiazka'
'error C2227: left of \->getAutor' must point to class/struct/union/generic type'

Zastanawia mnie fakt, że jak już w main() uruchomię sobie program, dodam Książkę, użyję metody:
biblioteka.dodajKsiazke(ksiazka);
to wywołanie:
cout << biblioteka.spis[0]->getAutor();  - podaje prawidłowy wynik

P-125315
pekfos
» 2015-01-21 17:17:40
Kompilator o typie Ksiazka wie tylko tyle, że jest.
C/C++
class Ksiazka; // deklaracja zapowiadająca
To o wiele za mało, byś mógł napisać taki kod, jaki chcesz.
P-125317
xast
Temat założony przez niniejszego użytkownika
» 2015-01-22 09:29:31
Pekfos - dzięki wielkie. Zmieniłem kolejność i umieściłem klasę Biblioteka na samym dole i działa. Teraz rozbiję to na pliki ( w sensie klasy w osobnych plikach) i to powinno chyba rozwiązać problem.

A może mi ktoś wytłumaczyć, czemu deklaracja zapowiadająca to jest za mało? Czy jak umieszczę klasy Wolumen i Ksiazka w osobnych plikach a potem dodam je jako plik nagłówkowy do klasy Biblioteka to ta klasa (Biblioteka) będzie wiedziała już wszystko o umieszczonych w plikach nagłówkowych klasach?

Dzięki za odpowiedź.
P-125354
pekfos
» 2015-01-22 10:39:40
A może mi ktoś wytłumaczyć, czemu deklaracja zapowiadająca to jest za mało?
Kompilator o typie Ksiazka wie tylko tyle, że jest.
..więc jak niby ma sprawdzić, jakie w tym typie są metody i z jakimi argumentami..?
P-125357
xast
Temat założony przez niniejszego użytkownika
» 2015-01-22 15:53:48
Dzięki :)
P-125374
« 1 »
  Strona 1 z 1