C++ Klassenabhängigkeiten auflösen

E

edeltoaster

Gast
aus geschwindigkeitsgründen bin ich gezwungenermaßen auf C++ umgestiegen und bin gerade auf ein interessantes problem gestoßen:

man hat 2 klassen, A und B.
nun nutzt A objekte von B und B objekte von A; gegenseitiges includen läuft natürlich nicht sauber durch,wie löst man in C++ solche zirkulären abhängigkeiten?

geht um die implementierung eines graphes, wobei knoten und kanten autark bleiben sollten.:(
 
Wozu soll das gut sein? Das widerspricht der Vererbungslehre. Wenn sich die Klasse A und B Objekte teilen, dann lagere diese Objekte in eine Klasse C aus.
 
hab hier diesbezüglich aber nichts gefunden leider... http://de.wikipedia.org/wiki/Vererbungslehre

Streiche einfach mal das Wort "Objekte" und mach da "Methoden" oder "Eigenschaften" hin... da fällt das Auslagern mitunter schon mal schwierig... Von einem richtigen Teilen war ja nicht unbedingt die Rede...

Wobei zirkuläre Abhängigkeiten vermieden werden sollten, mir ist noch nicht klar, warum die Klassen von sich gegenseitig abhängig sind... Ohne die Definitionen der Klassen zu sehen ist das hier doch nen Lotto-Spiel...
 
Zuletzt bearbeitet:
1668mib schrieb:
hab hier diesbezüglich aber nichts gefunden leider... http://de.wikipedia.org/wiki/Vererbungslehre

Das könnte vielleicht daran liegen das hier nicht die Rede von der genetischen Vererbungslehre war, sondern von der Vererbung in der objektorientierten Programmierung. :rolleyes:

1668mib schrieb:
Wobei zirkuläre Abhängigkeiten vermieden werden sollten, mir ist noch nicht klar, warum die Klassen von sich gegenseitig abhängig sind... Ohne die Definitionen der Klassen zu sehen ist das hier doch nen Lotto-Spiel...

Er will zu 99,9 % eine zirkuläre Abhängigkeit in einem gerichteten Graphen generieren. Und nun projeziert er das auf seine objekteorientierten Klassen, was natürlich falsch ist.

Den Zyklus stellt man durch innere Objektzeiger her!
 
Zuletzt bearbeitet:
hilfe naht! ich hab vor nen paar stunden grad was drüber gelesen :)
forward declaration nennt sich die lösung für dein problem

@stefan es geht glaub ich eher um die nutzung von methoden als um vererbung bei seinem problem (jedenfalls hoffe ich das, sonst ist an dem entwurf wirklich was faul^^)

code geklaut aus nem anderen forum, weil ich den artikel grad nicht finde
Code:
class A;    // You promise you will be defining class A soon enough and
            // you are also introducing the name into the scope.

class B {
    public:
        A& val1;   // it's ok. 
        A* val2;   // It's ok too. B will only be storing the address of A
        A  val3;   // Error. A needs to be fully defined. B needs to know it's size.
};

class A {
    public:
        B& val1;  // Ok. B name is known.
        B* val2;  // Ok too. For the same reasons.
        B  val3;  // Ok too. B has already been defined. B size is known.
};
 
hackebeil schrieb:
hilfe naht! ich hab vor nen paar stunden grad was drüber gelesen :)
forward declaration nennt sich die lösung für dein problem

@stefan es geht glaub ich eher um die nutzung von methoden als um vererbung bei seinem problem (jedenfalls hoffe ich das, sonst ist an dem entwurf wirklich was faul^^)

Und was sehen wir in dem Code? Richtig, Objektzeiger wie ich es oben bereits beschrieben habe. :rolleyes:
 
Ich glaube eher, er meint das Klasse A die Klasse B benutzt (als Parameter in einer Funktion) und anders rum. Das Problem ist denk ich mal, das in Klasse A "#include "b.h"" steht und in Klasse B "#include "a.h"". Und es da halt Probleme gibt. Da gibt es imo mehrere Möglichkeiten, das zu lösen.

#ifndef A_HEADER
#define A_HEADER

#include "a.h"

public class b
{
[...]
}

#endif

Dadurch wird sicher gestellt das b nur einmal definiert wird.

In A.h musst du dann nicht mehr b.h includen, es reicht wenn du die Klasse "bekannt" machst.

#ifndef B_HEADER
#define B_HEADER

public class a;

public class b
{
[...]
}

#endif

Dann weiß imo der Kompiler, das a später deklariert wird.

Kann auch sein dass totaler stuss ist^^...iwi frü am Morgen.

edit: ok... -.- habe nicht mal mitbekommen das hier schon geantwortet wurde......eindeutig zu früh am morgen.
 
sehr geil, hatte heut nacht auch noch forward deklaration gefunden/genutzt mit dem gewünschten ergebnis :)
jebb, ging auch um einen gerichteten graphen.

danke für eure hilfe!
 
Zurück
Oben