2016-08-13 4 views
0

J'ai actuellement deux classes: foo et bar. Foo utilise des instances de barre dans une de ses méthodes, et barre utilise une instance de foo dans son constructeur. Cependant, cela ne compilera pas. Je comprends qu'il y a une dépendance circulaire, donc j'ai essayé de sortir de ceci en déclarant la barre avant dans foo avant que la méthode de foo ne soit déclarée dans le fichier d'en-tête. Cela a échoué parce que je ne peux pas vraiment utiliser la barre ou aucun de ses composants dans la méthode de foo dans le fichier source. J'ai alors essayé de le réarranger pour que tout ce qui était nécessaire dans le fichier source soit déjà défini, ensuite j'ai mis toutes les définitions pour la barre, puis j'ai défini la méthode dans foo qui utilise la barre. Cela a échoué pour la même raison. Voici une version simplifiée de mon code à ce jour:Éviter les dépendances circulaires dans les définitions de classes en 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 
} 

Je voudrais souligner que lorsque je retire les références à l'instance de la barre dans la définition de foo :: méthode, le code compile et fonctionne correctement.

Mon exemple spécifique a la classe foo comme vecteur en coordonnées homogènes et la classe de barres comme quaternion. La classe de quaternion utilise un vecteur et un angle de rotation dans son constructeur, et la classe de vecteurs utilise le quaternion dans sa méthode de rotation.

Existe-t-il un moyen de coder ceci sans supprimer les dépendances ou dois-je simplement supprimer l'une des dépendances?

+0

votre code devrait fonctionner correctement si vous transférez déclare 'bar' avant' foo' (pas dedans) – vu1p3n0x

Répondre

1

Essayez d'avant de déclarer baren dehors de foo:

class bar; 

class foo{ 
    method(bar& b); 
} 

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

Comme vous l'avez là vous étiez en avant-déclaration d'une classe appelée foo::bar.

+0

'foo :: method' pourrait également utiliser un type de retour. – user4581301

+0

Et il lui manque aussi des points-virgules à la fin des cours, je n'avais pas remarqué. Sans compter que tout est privé ... Je pense qu'il a juste écrit un code démonstratif rapide là-bas. – MondKin

+0

@Mondkin Cela a fonctionné parfaitement. Cela pourrait-il aussi fonctionner si la barre était une sous-classe de foo? – AlgorithmsX