Klasa Predmet mora da bude svesna postojanja klase Artikal.
Sve uradi kako si planirao samo ces morati pre klase Predmet da deklarises klasu Artikal ( nacin na koji si ti razmisljao ). Znaci:
Code:
// Predmet header file
// ...
class Artikal;
class Predmet
{
//...
void Funkcija(Artikal * pArt);
}
Postoji mali problem sa ovim pristupom. Bolje resenje je da Funkcija prihvata argument Predmet i da se interno downcast-uje u Artikal...
Evo prvo kako bi to izgledalo kada bi argument bio Artikal:
Code:
#include <iostream>
class Artikal;
class Predmet
{
public:
virtual void Funkcija(Artikal * pArtikal) = 0;
};
class Artikal : public Predmet
{
public:
Artikal() { id = 3; }
void Funkcija(Artikal * pArtikal);
int id;
};
void Artikal::Funkcija(Artikal * pArtikal)
{
std::cout << pArtikal->id;
}
int _tmain(int argc, _TCHAR* argv[])
{
Predmet * pArt1 = new Artikal;
Predmet * pArt2 = new Artikal;
pArt2->Funkcija((Artikal*)pArt2);
return 0;
}
pArt2 se mora downcast-ovati i to mora uciniti korinik tvoje klase za razliku od sledeceg primera gde se implementacija downcast-ovanja sakriva u nasoj funkciji:
Code:
#include <iostream>
class Predmet
{
public:
virtual void Funkcija(Predmet * pPredmet) = 0;
};
class Artikal : public Predmet
{
public:
Artikal() { id = 3; }
void Funkcija(Predmet * pPredmet);
int id;
};
void Artikal::Funkcija(Predmet * pPredmet)
{
std::cout << ((Artikal*)pPredmet)->id;
}
int _tmain(int argc, _TCHAR* argv[])
{
Predmet * pArt1 = new Artikal;
Predmet * pArt2 = new Artikal;
pArt2->Funkcija(pArt2);
return 0;
}
Primecujes da sada Predmet ne zna nista o Artiklu ( njega to i ne zanima ) i zbog toga smo izbacili 'class Artikal' deo koda...
Nasa funkcija prihvata Predmet jer je i Artikal predmet ( u tvom dizajnu ).
Implementacija krije sta se zapravo zbiva tako da kod u main-u radi onako kako bi korisnik i ocekivao da koristi ove 2 klase.
Ako ti ovo nije bas najjasnije, pogledaj malo nasledjivanje, virtuelne funkcije i apstraktne klase :)