Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

C++ : gegenseitige Referenzierung

Dreamforger / 8 Antworten / Baumansicht Nickles

Hallo mal wieder.
Ich hab mal wieder ein triviales aber nerviges Problem mit C++: Ich habe zwei Klassen (jeweils mit header und c file). Reduziert sehen die beiden etwa so aus:

------ca.h--------
#include "cb.h"

class CA {
CB* other;
...
}

------cb.h--------
#include "ca.h"

class CB {
CA* other;
...
}

Die ... ersetzen Konstruktor, Destruktor und die eigentliche Funktionalität.

Das Problem ist jetzt das C++ beim Compilieren von CA, wg. include, CB übersetzt wird und darin findet es dann die Referenz auf CA, die aber noch nicht übersetzt wurde.

Ich hab schon alles mögliche mit extern und typedef ausprobiert, aber ich find die Richtige Syntax einfach nicht.

Danke für die Antworten
Dreamforger

bei Antwort benachrichtigen
toosten Dreamforger „C++ : gegenseitige Referenzierung“
Optionen

Klassen sind keine funktionen !!!

Das was du vorhast geht nicht ... ich verstehe auch den sinn nicht.

Schreib mal was das werden soll -> vielleicht finden wir eine andere lösung ;-).

toosten

bei Antwort benachrichtigen
Dreamforger toosten „Klassen sind keine funktionen !!! Das was du vorhast geht nicht ... ich verstehe...“
Optionen

Ich wollte es euch ja ersparen: Es geht um Inverse Kinematik.

Ein IKSkelett ist aus Knochen und Gelenken aufgebaut. Jeder Knochen hat eine Vater- und ein Kind-Gelenk. Jedes Gelenk hat einen oder keinen Vater-Knochen und beliebig viele Kind-Knochen.
z.b
G-K-G;
oder
G-K-G-K-G
|
K-G-K-G

wie gesagt: eine alternierende beliebig große verkettete Datenstruktur. Ich weis ja nicht wie das jetzt weiterhilft, das Problem hab ich ja bereits isoliert

bei Antwort benachrichtigen
Andreas42 Dreamforger „Ich wollte es euch ja ersparen: Es geht um Inverse Kinematik. Ein IKSkelett ist...“
Optionen

Hi!

Mein Ansatz wäre gewesen die Klasse Kind als Nachfahre der Klasse Vater zu deklarieren. Vater enthält nur eine Referenz auf Vater (und nicht auf Kind, wie in deinem Beispiel).
Da Kind ein Nachfahre von Vater ist, kann man dann dort natürlich einen Zeiger auf eine Kind-Instanz übergeben.

Im Moment ist mir aber der funktionelle Unterschied zwischen Vater- und Kind-Gelenk noch nicht klar.
Worauf ich hinaus will ist: evtl. kommt man mit einer Gelenkklasse aus und legt den Unterschied zwischen Vater und Kind einfach über ein Attribut fest.

Bis denn
Andreas

Hier steht was ueber mein altes Hard- und Softwaregedoens.
bei Antwort benachrichtigen
Dreamforger Andreas42 „Hi! Mein Ansatz wäre gewesen die Klasse Kind als Nachfahre der Klasse Vater zu...“
Optionen

Vater und Kind waren keine Begriffe aus der OOP sondern steuerungsprioritäteten im IK zyklus.

bei Antwort benachrichtigen
Andreas42 Dreamforger „Vater und Kind waren keine Begriffe aus der OOP sondern steuerungsprioritäteten...“
Optionen

Hi!

"Steuerungsprioritäten im IK-Zyklus" sagt mir nun gar nicht, hört sich aber irgendwie gut an (hatte neulich erst "Inventursperre für Tablar mit Einlagerungsauftrag in AKL" auf Platz 1 gesetzt). ;-)

Scherz bei Seite, die Lösung mittels Vorwärtsdeklaration hast du ja inzwischen bekommen. Mein Vorschlag war eher ein Denkansatz, ob man die zwei verschiedenen Klassen braucht oder ob man auch mit einer Auskommen kann. Das ist mein üblicher Lösungsansatz, wenn zwischen zwei Klassen nur geringe Unterschiede bestehen.
Die dritte Lösung durch einen gemeinsamen Vorfahren, ist ja inzwischen auch gekommen.

Bis denn
Andreas

Hier steht was ueber mein altes Hard- und Softwaregedoens.
bei Antwort benachrichtigen
Ben Horne Dreamforger „C++ : gegenseitige Referenzierung“
Optionen

Du hast Recht, es ist trivial, dein Stichwort ist die Vorwärtsdekleration oder auch Vorwegdekleration, mach folgendes:

#include "cb.h"
class CA
{
   class CB; // das hier ist die Vorwärtsdekleration

   public:
   CA();
   virtual ~CA();

   CB* other;
};

#include "ca.h"
class CB
{
   class CA; // das hier ist die Vorwärtsdekleration

   public:
   CB();
   virtual ~CB();

   CA* other;
};

greetz
BEN

bei Antwort benachrichtigen
Dreamforger Ben Horne „Du hast Recht, es ist trivial, dein Stichwort ist die Vorwärtsdekleration oder...“
Optionen

Perfect!
genau das hab ich gesucht.

vielen Dank

bei Antwort benachrichtigen
T-Rex Dreamforger „C++ : gegenseitige Referenzierung“
Optionen

Ganz anderer Lösungsansatz:

Du erstellst eine Klasse, von der sich Deine beiden genannten ableiten. Als Referenz mußt Du dann jedesmal die Basisklasse eintragen, durch die Pointer kannst Du dann jedesmal auf das entsprechende Objekt zugreifen:

Class CBasis
{
...
}

Class CA : CBasis
{
cb *CBasis;
...
}

Class CB : CBasis
{
ca: CBasis
...
}

PS: Ich komme im Moment nicht auf die Fachwörter, sonst könnte ich Dir damit weiterhelfen

 GrüßeT-Rex 
bei Antwort benachrichtigen