Klasse A hängt von B ab, diese allerdings wieder von A
-
Hallo,
zuallererst möchte ich mich für den (meiner Meinung nach) schlecht gewählten Titel entschuldigen, doch besser und vor allem kürzer schien sich das Problem, das ich habe nicht beschreiben. Hier der stark vereinfachte Code:
// Datei: class.h #ifndef CLASS_H #define CLASS_H #include "matrix.h" class Class { public: static const int width = 10; static const int height = 10; private: Matrix m; }; #endif // Datei: matrix.h #ifndef MATRIX_H #define MATRIX_H #include "class.h" class Matrix { // ... int elements[Class::width][Class::height]; }; #endif // Datei: main.cc #include "matrix.h" int main() { // Bla bla bla }
Compiler-Fehler:
$ g++ bla.c -o bla -W -Wall -pedantic -ansi In file included from class.h:4, from main.cc:1: matrix.h:9: error: `Class' has not been declared matrix.h:9: error: `width' was not declared in this scope matrix.h:9: error: `Class' has not been declared matrix.h:9: error: `height' was not declared in this scope
Es geht mir darum, ob es so möglich ist, wie ich es beabsichtige, daher will ich Matrix::elements nicht mit new allokieren und auch nicht als Vektor von Vektoren.
Wie kann ich diesem "Teufelskreis der Abhängigkeiten" Herr werden? Es wäre schön, wenn mir jemand weiterhelfen könnte.Danke,
Bernhard
-
Mir ist ein kleiner Fehler unterlaufen: main.cc bindet "class.h" ein, nicht "matrix.h". Konnte leider als Gast nicht editieren, darum hab ich mich nun angemeldet, um das in Zukunft zu vermeiden
-
musste mit einer forward declaration gehen, du schreibst halt in
class A; damit bekannt ist das es diese Klasse gibt
-
mir würde nun spontan einfallen, beide klassen gegenseitig als friend zu deklarieren... ich weiß aber nicht, was die profis hier dazu sagen
//edit:
nur die class class muss matrix als friend deklarieren
-
kikik schrieb:
musste mit einer forward declaration gehen, du schreibst halt in
class A; damit bekannt ist das es diese Klasse gibtWenn ich in matrix.h das #include "class.h" durch class Class; ersetze, erhalte ich folgenden Fehler:
matrix.h:9: error: incomplete type `Class' used in nested name specifier matrix.h:9: error: incomplete type `Class' used in nested name specifier
Wenn ich in class.h das #include "matrix.h" durch class Matrix; ersetze, erhalte ich diesen:
class.h:14: error: field `m' has incomplete type
leech schrieb:
mir würde nun spontan einfallen, beide klassen gegenseitig als friend zu deklarieren... ich weiß aber nicht, was die profis hier dazu sagen
Das bringt in diesem Fall soweit ich weiß nichts, weil ich ja nicht auf private Elemente zugreifen will sondern ein Problem mit Deklarationen habe. Oder habe ich etwas übersehen?
Edit:
"friend class Matrix;" in Class hat keine Auswirkungen auf das Problem.
-
oh jau stimmt... hatte mich verguckt
-
Class (ps. schlechter name) soll nur ein pinter auf Matrix haben und dafür reicht eine forward deklaration,
-
Gerard schrieb:
Class (ps. schlechter name) soll nur ein pinter auf Matrix haben und dafür reicht eine forward deklaration,
Ja, aber gibt es auch eine Möglichkeit ohne Zeiger?
PS: Der Code ist wie gesagt vereinfach und verallgemeinert. In der richtigen Version heißt die Klasse natürlich nicht Class
-
??
wo ist das problem bei zeigern?
-
bernhard_ schrieb:
Es geht mir darum, ob es so möglich ist, wie ich es beabsichtige, daher will ich Matrix::elements nicht mit new allokieren und auch nicht als Vektor von Vektoren.
Ich habe es so "gelöst", aber ich würde dennoch gerne wissen, ob es nicht auch anders geht. Meiner Meinung nach ist es logischer, ein Array, von dem man die Größe beim Kompilieren weiß, und die sich nie ändert, statisch anzulegen.