2016-08-13 9 views
0

Ich habe derzeit zwei Klassen: foo und bar. Foo verwendet Instanzen von bar in einer seiner Methoden, und bar verwendet eine Instanz von foo in seinem Konstruktor. Dies wird jedoch nicht kompiliert. Ich verstehe, dass es eine zirkuläre Abhängigkeit gibt, also habe ich versucht, aus diesem herauszubrechen, indem ich den Balken innerhalb von foo nach vorne deklariere, bevor die foo-Methode in der Header-Datei deklariert wird. Das ist fehlgeschlagen, weil ich in der Quelldatei in der Methode von foo überhaupt keine Leiste oder irgendwelche Komponenten verwenden kann. Ich habe dann versucht, es neu zu arrangieren, so dass alles in der Quelldatei, die die Leiste benötigte, bereits definiert war, dann habe ich alle Definitionen für die Leiste eingegeben, dann habe ich die Methode in foo definiert, die die Leiste verwendet. Das ist aus dem gleichen Grund fehlgeschlagen. Hier ist eine vereinfachte Version von meinem Code so weit:Vermeiden von zirkulären Abhängigkeiten in Klassen-Definitionen in C++

// Header.h 
class foo{ 
    class bar; 

    void method(bar& b); 
}; 

class bar{ 
    bar(foo& f, double d); 
}; 

// Source.cpp 
#include Header.h 
// stuff defining foo that I need for bar in the form foo::foo(...){...} 

// stuff defining bar that I need for foo::method 

void foo::method(bar& b){ 
    // do stuff with foo and b 
} 

Ich möchte darauf hinweisen, dass, wenn ich Verweise entfernen, um die Instanz von bar in der Definition von foo :: Methode, wird der Code kompiliert und ordnungsgemäß ausgeführt wird.

Mein spezifisches Beispiel hat die foo-Klasse als Vektor in homogenen Koordinaten und die Balkenklasse als Quaternion. Die Quaternion-Klasse verwendet einen Vektor und einen Drehwinkel in ihrem Konstruktor, und die Vektorklasse verwendet das Quaternion in seiner Rotationsmethode.

Gibt es eine Möglichkeit, dies zu programmieren, ohne die Abhängigkeiten zu entfernen, oder sollte ich nur eine der Abhängigkeiten entfernen?

+0

Ihr Code sollte gut funktionieren, wenn Sie "bar" vor 'foo' deklarieren (nicht innerhalb) – vu1p3n0x

Antwort

1

vorwärts Versuchen erklärt baraußerhalb von foo:

class bar; 

class foo{ 
    method(bar& b); 
} 

class bar{ 
    bar(foo& f, double d); 
} 

Wie Sie es dort hatten, wurden Sie eine Klasse foo::bar genannt zukunfts erklärt.

+0

' foo :: method' könnte auch einen Rückgabetyp verwenden. – user4581301

+0

Und am Ende des Kurses fehlen auch einige Semikolons, die ich nicht bemerkt habe. Ganz zu schweigen davon, dass alles privat ist ... Ich glaube, er hat gerade einen kurzen Demonstrationscode geschrieben. – MondKin

+0

@Mondkin Das hat perfekt funktioniert. Könnte das auch funktionieren, wenn bar eine Unterklasse von foo ist? – AlgorithmsX

Verwandte Themen