Gegenseitige Includes in C++

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
TRex
Moderator
Beiträge: 8343
Registriert: 23.11.2006 12:23:54
Wohnort: KA

Gegenseitige Includes in C++

Beitrag von TRex » 09.12.2007 23:59:52

Ich hab ein Problem mit ner fertigen Implementierung, zu dessen Nutzung ich gezwungen werde...die aber nicht funktioniert.

folgendes:

point.h

Code: Alles auswählen

class Point {
friend class Vector;
[...]
und

vector.h

Code: Alles auswählen

class Vector : public Point
	{
[...]
bringt mich ins Schwitzen. Da die gegenseitig includet werden müssen, krieg ich das nicht gebacken.

Code: Alles auswählen

vector.h:22: error: expected class-name before ‘{’ token
weil er zu dem Zeitpunkt den Typ Point nicht kennt. Die braucht zur Vervollständigung ja erstmal Vektor :(

Der Mist stammt übrigens von http://www.softsurfer.com/, weswegen ich eigentlich dachte, dass das auch funktioniert.
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!Wie man widerspricht

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von GoKi » 10.12.2007 00:39:36

Du machst in point.h eine forward declaration, damit point.h nicht auch vector.h includen muss. Dann sollte sich der alte Kram da kompilieren lassen.

point.h

Code: Alles auswählen

...
// forward declaration
class Vector;

class Point {
friend class Vector;
....
};
MfG GoKi
:wq

Benutzeravatar
TRex
Moderator
Beiträge: 8343
Registriert: 23.11.2006 12:23:54
Wohnort: KA

Beitrag von TRex » 10.12.2007 10:37:19

Danke, das bringt mich schon ein bisschen weiter. Allerdings meckert er nun bei einer Methode der point-Klasse, weil Vector noch nicht vollständig ist:

Code: Alles auswählen

Vector Point::operator-( Point Q)        // Vector diff of Points
{
	Vector v;
	v.x = x - Q.x;
	v.y = y - Q.y;
	v.z = z - Q.z;
	v.dimn = max( dimn, Q.dim());
	return v;
}

Code: Alles auswählen

point.cpp: In member function ‘Point Point::operator-(Vector)’:
point.cpp:166: error: ‘v’ has incomplete type
Die forward Declaration gefällt ihm aber auch nicht so richtig..

Code: Alles auswählen

point.h:20: error: forward declaration of ‘struct Vector’
Muss ich da noch was wegen den Includes beachten?

Hier mal die ganzen Dateien:

http://nopaste.debianforum.de/7109
http://nopaste.debianforum.de/7110
http://nopaste.debianforum.de/7111
http://nopaste.debianforum.de/7112
http://nopaste.debianforum.de/7113
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!Wie man widerspricht

goecke
Beiträge: 289
Registriert: 12.01.2007 11:57:27

Beitrag von goecke » 10.12.2007 10:50:35

Hi,

Du solltest in den point.cpp File das "vector.h" noch inkludieren.

Überall dort wo du Klassen benutzt (Member) ]muß zwingend auch die
echte Klassen-Deklaration bekannt sein (normalerweise
den Header includieren)

HTH
Johannes

Benutzeravatar
TRex
Moderator
Beiträge: 8343
Registriert: 23.11.2006 12:23:54
Wohnort: KA

Beitrag von TRex » 10.12.2007 14:27:45

Das hat ja eben nicht funktioniert...dann komm ich in Teufels Küche, weil er A includet, die B benötigt, wobei B aber noch nicht vollständig ist, weil A noch nicht da ist.

Ich habs jetzt aufgelöst, indem ich die Vektorklasse nicht mehr von Point ableite und die fehlenden Elemente in die Vektor kopiert habe.

Danke aber für die Hilfe :)

Durfte mir übrigens eben von meinem Doz anhören, dass die Implementierung "krank" ist und wir das eigentlich selber lösen sollten...aber er erkennt die Mühe an, das zum Laufen zu bringen, also so gesehen ists kein Problem.

Das Endergebnis (Zeichnen eines Kreises um ne Wolke von Punkten mittels Bresenham) kann sich sehen lassen :)

Ich schick das Paket (n paar kb) gerne raus, falls das nochmal irgendwann gesucht wird.
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!Wie man widerspricht

Benutzeravatar
armin
Beiträge: 2682
Registriert: 17.03.2005 11:49:14

Beitrag von armin » 10.12.2007 15:54:20

Es ist zwar gelöst, ich frage mich aber eh, warum du einen Vektor von einem Punkt ableitest. Sollte ein Vektor nicht eher zwei Punkte als Member Variable enthalten? Dem Liskov Substitution Principle dürfte das nicht unbdedingt entsprechen ;)
Formerly known as Trigger.
HP 8510p - Debian Sid
Mitglied des Debian-KDE-Teams

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von GoKi » 10.12.2007 18:46:39

TRex2003 hat geschrieben:Das hat ja eben nicht funktioniert...dann komm ich in Teufels Küche, weil er A includet, die B benötigt, wobei B aber noch nicht vollständig ist, weil A noch nicht da ist.

Ich habs jetzt aufgelöst, indem ich die Vektorklasse nicht mehr von Point ableite und die fehlenden Elemente in die Vektor kopiert habe.
Ich habe den Quark gestern Abend kompiliert und die einzige Änderung war die forward declaration in point.h. Das include von vector.h in point.c muss dort bleiben.

Die forward declaration umgeht in diesen Fall den gegenseitigen Include.

Über Sinn und Zweck dieser lustigen Klassenhierarchie brauchen wir uns net zu unterhalten.
MfG GoKi
:wq

Benutzeravatar
TRex
Moderator
Beiträge: 8343
Registriert: 23.11.2006 12:23:54
Wohnort: KA

Beitrag von TRex » 10.12.2007 20:37:25

Trigger. hat geschrieben:Es ist zwar gelöst, ich frage mich aber eh, warum du einen Vektor von einem Punkt ableitest.
Naja, is ja nicht auf meinen Mist gewachsen...ich hätt das nie so gemacht :D
Ich habe den Quark gestern Abend kompiliert und die einzige Änderung war die forward declaration in point.h. Das include von vector.h in point.c muss dort bleiben.
Bei mir meckert er wie oben geschrieben die Forward declaration an. Hast du irgendwelche speziellen Flags für den Compiler oder so?

Eventuell liegts auch an meinem Makefile. Das wurde automatisch von qmake-qt4 erstellt.
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!Wie man widerspricht

Antworten