Hej Fabio,
Jeg har vist ikke været særlig god til at forklare hvad jeg gerne vil (have
den skal gøre).. Jeg har prøvet at udspecificere det lidt med det svar til
'bjn' - men jeg vil da gerne prøve at omformulere mig for 3. gang ;) - Man
siger jo 3. gang er lykkens gang :)
Men først vil jeg lige svare på dine spørgsmål/foreslag :)
> (1) er du *helt* sikker på, at man med en lille strukturændring kan bruge
> peger til funktioner? (peger til funktioner må gerne kalde statiske
> medlemsfuntkioner fra en klasse)
Jeg har prøvet at lave pointere til en funktion af samme header - det
virkede fint. Da jeg så prøvede at lave den om til pointere til en funktion
i en klasse, klagede den vildt. Det jeg har fået at vide er følgende:
Pointer til en funktion:
typdef int (* minFunktion) (int a);
Pointer til en funktion i en klasse:
typedef int (Klasse::*minFunktion) (int a)
Problemet her er at "Klasse" er ukendt, indtil den klasse registrerer sig.
Dvs, jeg kan ikke skrive Klasse, da det jo er en definition på en bestemt
klasse, der hedder Klasse.
> (2) Hvad hvis du lavede en base klasse, som har callback funktionen
> defineret som virtual, og lade kylling og bamse arv fra den?
Der er tale om X antal funktioner, den ene kan kalde på den anden. Begge
klasser er vidt FORSKELLIGE, og har ingen identiske funktioner - hverkens
funktionsmæssig eller datamæssigt - relationen mellem dem er, at de
supplerer hinanden, så at sige..
> (3) Siden du ikke skal bruge mange callbacks, kunne man ikke erklære en
> "extern" funktion i bamse, som kyllig kunne kalde og omvednt?
Hvis jeg på nogen tidspunkt har skrevet at der er tale om få
callbacks/events, så må du meget undskylde. Der er nemlig tale om MANGE
events, og callbacks. - Event i den ene klasse, callback i den anden klasse
> (4) Kyllyng er en attribut i Bamse, kunne man ikke lave Kylling til en
> Kylling* (peger til kylling attribut), og i Bamse.H skrive i toppen
> erklæringen: class Kylling; og linjen efter fortsætte definitionen af
Bamse?
Det er rigtigt. I mit oprindelige program er der tale om pointere. Jeg
trimmede bare alt det "unødvendige" væk. Altså:
Bamse.h: Kylling *kylling;
Kylling.h: Bamse *bamse;
> fx..
>
> Bamse.H:
> #include kylling
> class Kylling;
> class Bamse
> {
> Bamse* b;
> };
>
> Kylling.H:
> class Bamse;
> class Kylling
> {
> Kylling* k;
> };
> #include bamse.h
Eksemplet er lidt forkert, da de skal have referencer til hinanden - dvs
"Bamse *b"; skal ligge i Kylling klassen, og omvendt - men jeg forstår fint,
hvad du vil frem til ;)
Men alt i alt - jeg vil bare gerne kunne compile de 2 klasser - hvis det
virker, så skulle det gerne virke.
Her er så situationen - en lille historie:
Kylling er den klogeste. Kyllingen har 3 poser med - blå, sort og gul.
Bamse er ikke så klog. Bamsen har 1 pose med.
Inden Bamse og Kylling går en tur i parken for at rydde op, siger kyllingen
til bamsen (binding til events):
- Hvis du finder en støvle, skal du smide den i min blå pose.
- Hvis du finder en død hund, skal du smide den i min sorte pose.
- Hvis du finder en diamant, skal du smide den i min gule pose.
Dvs, når Bamsen finder noget på jorden, finder den ud først ud af hvad det
er den, har fundet. Er det en støvle, smider den støvlen ind i den blå pose
(dvs Bamsen kalder f.eks. kylling->behandl_støvle(støvlen); ) - det samme
for de andre 2 typer, altså kylling->behandl_diamant(), og
kylling->behandl_død_hund(). Finder den noget, som den ved at Kyllingen ikke
er interesseret i, smider den det bare væk igen.
Kyllingen vil så, når den får noget i en pose, analyserer om kvaliteten er
god nok - hvordan den finder ud af om kvaliteten er ok, afhænger af hvilken
funktion, der blev kaldt. (I mellemtiden er Bamsen i gang med at finde andre
ting).
- Hvis kyllingen så kommer frem til at kvaliteten af støvlen er ok, smider
den det i Bamsens pose (dvs, Kyllingen kalder en funktion på bamsen - f.eks.
bamse->behold_ting(støvle); ).
- Men hvis kyllingen kom frem til at støvlen ikke kunne bruges, kalder den
en anden funktion på Bamsen - f.eks. bamse->smid_ting(støvle);
Og sådan går de rundt til de ikke gider mere (og samtlige omtalte poser kan
indeholde uendelig antal af noget) :)
Jeg har tænkt på at lave samtlige events i klasser (1 nedarvet klasse pr
event). Det gør det muligt at overføre referencer til hele event objekter.
F.eks.:
class Event
{
public:
virtual void onEvent(int noget);
}
class Støvle_Event: public Event
{
public:
void onEvent(int noget)
{
Gør noget;
}
}
class Diamant_Event: public Event
{
public:
void onEvent(int noget)
{
Gør noget andet;
}
}
Jeg tror at det er det, "folk" har svaret mig på - men det er IKKE
problemet. I teorien skulle den lille historie virke, og det gør det også i
andre tæt-relateret sprog som JAVA).
Problemet er - hvorfor kan jeg ikke #include "Bamse.h" fra Kylling.h - og
omvendt? Hvis jeg bryder referencen, så den kun går den ene vej, dvs bamsen
kan kalde funktioner på kyllingen, men ikke omvendt - så virker det.
Er der en løsning på det her? :)
Mvh
- me