[gelöst] problem: gekreuzte includes
-
hi,
ich habe zwei klassen, welche jeweils gegenseitige pointer auf ihre instanzen beinhalten.
Auf´s wesentliche gekürzt sehen die dann so aus:class VirtualLine; //vorwärtsdeklaration wegen 'gekreutzten includes' class Cell{ public: Cell(uint value, uint totalCandidates, uint vlCount, uint *index); private: VirtualLine** vl; /// Liste der 'virtuellen Linien', welche };
class VirtualLine{ public: VirtualLine(Cell **cells, uint numCells, uint type); private: Cell **cells; };
beide Klassen enthalten also verweise aufeinander. leider kann ich, wegen der vorwärtsdeklaration von 'virtualline', innerhalb der Klasse 'Cell' keine funktionen der klasse virtualline aufrufen.
bsp:
folgender aufruf :
this->vl[i]->setCandidate(candidate, value);
liefert folgene fehlermeldung:
error C2027: Verwendung des undefinierten Typs "VirtualLine"
Ich denke mal, dass hier gegen grundprinzipien der OO-Programmierung verstoße indem ich versuche "echte" überkreutzte includes zu realisieren, weiß aber leider nicht wie ich es besser machen soll. Gibt es also eine Möglichkeit "echte " überkreutzte includes zu realisieren oder irgendein grundsätzliches Verfahren solche probleme zu umgehen?
-
Du kannst das Problem durch Interfaceklassen lösen (pure virtuall class).
Dann brauchen VirtualLine und Cell sich nicht gegenseitig inkludieren.
-
Oder die Aufrufe in ne cpp-Datei auslagern.
-
Michael E. schrieb:
Oder die Aufrufe in ne cpp-Datei auslagern.
Definitiv am sinnvollsten. Falls die Klassen anwachsen sollten, wird die Header-Datei sonst auch ziemlich unübersichtlich.
-
Und wenn du die Funktionen trotzdem inline haben willst, dann mach doch einfach ein ".inl" File dazu, wo du die Funktionen drinnen definierst. Schreibst du ganz genauso wie du's im .cpp schreiben würdest bloss mit dem keyword "inline" davor.
Und in diesem .inl File inkludierst du eben vorher einfach die Header die VirtualLine definiert. Beispielweise.
-
erstmal ein frohes neues jahr an alle und danke für die antworten!
mein problem war leichter zu lösen als ich dachte. Ich musste nur in jede headerdatei je eine vorwärtsdeklaration einfügen und jeweils beide header dann in den .cpp dateien includieren. trotzdem vielen dank für die antworten und noch viel spass beim ausnüchtern...