[ alpha @ 04.06.2004. 01:35 ] @
Ok, ono sto zelim da pitam je sledece:
da li apstraktna klasa moze da bude izvedena?
Recimo nesto ovako:
Code:

class Moja{
int a;
public:
...
};

class MojaIzvedena : public Moja{
int b;
public:
...
virtual void NekaFunkcija()=0;
...
};

[ Revisor @ 04.06.2004. 15:42 ] @
Apperently moze. Sta je problem?
[ alpha @ 04.06.2004. 20:54 ] @
U medjuvremenu sam malo prokopao po literaturi i video da to nigde nije eksplicitno receno, pa sam zato pitao.
Problem je, u stvari, na sasvim drugoj strani. Imam zadatak da uradim odredjeni sistem klasa. I poenta je da nisam bio najsigurniji u tome sta koja klasa treba da nasledi, i koja klasa treba da bude bazna. Medjutim to sam u medjuvremenu kako tako resio (radi se o klasi figura koju nasledjuju klase kvadrat, krug, mnogougao i trougao - ali ispod svega toga postoje i klase boja i tacka i sve se to zakomplikovalo...) ali sad imam sledeci problem:
napravio sam listu ciji su elementi pokazivaci na pokazivace apstraktne klase. Ali, kada dodam element u listu, kompajler kaze ne moze, sinak...
otprilike to izgleda ovako:
Code:

class Figura{
...
};

class Trougao:public Figura{
...
};

class Lista{
struct Element{
Figura ** sadrzaj;
Element * sledeci;
};
Element * prvi;
Element * poslednji;
public:
void UbaciFiguru(Figura ** ff){
...
}
};

int main(){
Lista ll;
Trougao ** tt;
ll.UbaciFiguru(tt); // ovde mi kaze da tip argumenta ne odgovara
...
return 1;
}


izbacio sam sve detalje iz gornjeg listinga, ali imam i konstruktore i destruktore i celu pricu uradjenu, ali negde ocigledno gresim... verovatno nisam skapirao pravilno kako funkcionise nasledjivanje i sta u stvari predstavjla objekat koji je nasledio apstraktnu klasu...
[ filmil @ 04.06.2004. 22:58 ] @
Greška je u sledećem. Iako važi Trougao is-a Figura, pa čak i Trougao* is-a Figura*, to ne važi za pointer na pointer: Trougao** not is-a Figura**.

Rešenje tvog problema jeste da tt deklarišeš kao Figura **tt, a ne Trougao **tt.

Ja bih radije koristio STL: Vector<Figura*> ili nešto slično.

f
[ alpha @ 05.06.2004. 00:31 ] @
Ali kako da onda ubacim neku konkretnu figuru, recimo trougao, u tu listu? Jer to i jeste poenta te liste... pregledao sam ranije poruke na forumu, i video da je vec neko postavio slican problem, samo sto je taj problem sa dinamickim nizom. Nemam striktan zahtev da moj problem resim preko liste, ali mislim da je to elegantnije resenje.
Isto tako, i ja smatram da bi mozda template-i i STL bili bolje resenje za ovo, ali ne bih da ulazim sad i u to, jer nisam radio sa njima do sada, i malo sam kratak sa vremenom.
[ filmil @ 05.06.2004. 00:44 ] @
Sve što treba je da promeniš deklaraciju Trougao **tt u Figura **tt. Ostatak programa ne treba da se menja.

f
[ Pah-Wrait @ 06.06.2004. 00:17 ] @
Code:

class Figura{
...
};

class Trougao:public Figura{
...
};

class Lista{
struct Element{
Figura ** sadrzaj;
Element * sledeci;
};
Element * prvi;
Element * poslednji;
public:
void UbaciFiguru(Figura ** ff){
...
}
};

int main(){
Lista ll;
Trougao ** tt;
ll.UbaciFiguru(tt); // ovde mi kaze da tip argumenta ne odgovara
...
return 1;
}


E sad, fora!!!
Naravno da se argumenti razlikuju, ali promasio si poentu zasto se prave izvedene, virtuelne i apstraktne klase!!!
U mani treba da stoji sledece:

int main(){
Lista ll;
Figura ** tt;
*t=new Trougao;
ll.UbaciFiguru(tt);
...
return 0;
}

Dobio si da pokazivac na osnovnu klasu bude podatak neke izvedene klase, tako da mozes da u kombinujes mnogo razlicitih podataka (iz jedne klase moze biti neograniceno izvedenih). Koristis istu funkciju svuda, samo menjas pokazivac koji je tipa osnovne klase (kao i u dekleraciji f-je), a pokazuje na podatke izvedene klase.
Pozdravs