gensidige inkluderinger

Tags:    c++

Hej udviklere,
jeg har en klasse der kan holde styr på en stor mængde datalag (dyrearter, men det er lige meget). For at gøre mit design mere overskueligt har jeg en separat klasse til at håndtere filer: indlæse og gemme datalag, osv.
Problemet er at datalagene er pointers (Layer *) - de bliver dannet af fillæsningsklassen, men det er dataklassen der har ansvar for at delete dem. For at sikre mig at dataklassen rent faktisk tager ansvar for pointerne vil jeg gerne have et design a la
Fold kodeboks ind/udKode 


Problemet er at begge klasser har brug for at se hinandens implementering (da Dataset indeholder et FileReader objekt, og Filereader henviser til en Dataset funktion. - og det giver fejlmeddelelser fra min compiler.
Hvad kan jeg gøre for at undgå dette?



Indlæg senest redigeret d. 05.11.2007 20:20 af Bruger #8249
6 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
Problemet er mere generelt: mit program svømmer i gensidige inkluderinger, og jeg får fejmeddelelser på det hele. Er der en eller anden helt grundlæggende fingerregel jeg ikke er klar over?
PS: jeg bruger forward declarations af klasser hvor jeg kan, hvis jeg skal bruge dem - men det løser kun få af problemerne



Helt generelt kan man ikke have at class A skal kende class B og class B skal kende class A. Uanset om det er i en eller flere filer.

Hvis ikke forward erklæring løser problemet kan man være nødt til at lave en "interface" class:

class Bif
{
public:
virtual void Read(class A* a) = 0;
...
};

class A
{
public
Bif* bif;
void Do()
{
bif->Read(this);
}
};

class B : public Bif
{
public:
void Read(class A* a)
{
...
}
};



Fold kodeboks ind/udKode 




Tak,
det er en ny og hidtil uovervejet vanskelighed at jeg ikke kan lade klasser kende hinandens implementering. Jeg "løste" problemet ved blot at gøre hele klassen Dataset til friend - men jeg tror jeg skal gentænke min klassestruktur.
Robert >> Så vidt jeg kan se kan dit eksempel klares med en forward declaration, da du kun bruger pointere - mit problem er at mit design tvinger klasserne til at kende hinandens medlemmer, og så må jeg bruge #includes




Indlæg senest redigeret d. 08.11.2007 17:45 af Bruger #8249

Robert >> Så vidt jeg kan se kan dit eksempel klares med en forward declaration, da du kun bruger pointere - mit problem er at mit design tvinger klasserne til at kende hinandens medlemmer, og så må jeg bruge #includes


Hvorfor er de nødt til det ?
Du kan jo ikke oprette begge objekter samtidig til at indeholde hinanden. Mindst den ene er nødt til at have en pointer til den anden.



Hvorfor er de nødt til det ?
Du kan jo ikke oprette begge objekter samtidig til at indeholde hinanden. Mindst den ene er nødt til at have en pointer til den anden.


I det ovennævnte tilfælde er det fordi Dataset indeholder et objekt af typen FileReader (til at håndtere filer). Men jeg ville gerne have at FileReader kun kunne bruges af en enkelt funktion i Dataset, nemlig en funktion der sikrer at Dataset overtager ejerskabet for pointerne. Derfor ville jeg lave en
Fold kodeboks ind/udKode 
. - og så skulle FileReader kende Dataset's implementering. Men nu du gør mig opmærksom på det kan jeg godt se at jeg formentlig kunne løse det problem ved at have en pointer til FileReader i stedet :-)




Indlæg senest redigeret d. 09.11.2007 20:38 af Bruger #8249
t