11
votes

Quelle est la meilleure façon de gérer les classes co-dépendantes en C ++?

dire que j'ai une classe foo avec un objet de barre de classe en tant que membre

class bar;


0 commentaires

4 Réponses :


0
votes

Autant que je sache, la seule façon réelle de cela consiste à utiliser des pointeurs car ils ne nécessitent pas de définition de classe avant l'unité de traduction (.CPP) auquel cas les deux classes auront été définies correctement.


0 commentaires

24
votes

Vous devez déplacer tout l'accès de membre hors de l'en-tête et dans vos fichiers source.

De cette façon, vous pouvez transmettre vos cours dans l'en-tête et les définir à FOO: P> xxx pré>

qui vous permettra de travailler - vous ne pouvez tout simplement pas mettre des définitions qui nécessitent des informations membres dans votre en-tête - déplacez-la au fichier .cpp. Les fichiers .cpp peuvent inclure à la fois FOO.H et BAR.H: P>

// Foo.cpp
#include "foo.h"
#Include "bar.h"

void foo::some_method() {
     this->m_pbar->do_something(); // Legal, now, since both headers have been included
}


2 commentaires

Cela semble être la meilleure option pour ce dont j'ai besoin.


Maintenant, comment cette solution fonctionne-t-elle si vos classes codépendantes sont modèles et ne peuvent donc pas être séparées dans des fichiers en-tête et CPP?



2
votes

Je suppose qu'une façon est de faire des classes d'interface abstrait sans membres. Puis la sous-classe FOO et la barre de ces classes d'interface.

par exemple: xxx

Ceci casse le cycle des dépendances (à moins que les interfaces elles-mêmes ne dépendent l'une de l'autre, et si c'est le cas, alors ils devraient probablement être déclarés dans le même fichier)


0 commentaires

2
votes

dans votre exemple, foo dépend de la barre (car il contient une barre réelle objet), mais bar Ne dépend pas de foo (puisqu'il contient uniquement un foo * ). Maintenant, BAR dépend de sur FOO étant un nom de type, alors bar.h a besoin d'une déclaration en avant du nom: Classe FOO; . FOO dépend de la barre , donc foo.h doit contenir #include "bar.h"

Vous ne pouvez pas avoir de cours qui dépendent directement les uns sur les autres en C ++; Cela ne fonctionne tout simplement pas. Vous devez découpler les classes de telle sorte que cela ne dépend que de l'autre existant, comme dans votre exemple. Les seules choses qui créent une dépendance directe utilisent une classe comme classe de base ou en tant que champ; Toute autre utilisation crée simplement une dépendance indirecte, ce qui n'est généralement pas un problème.


0 commentaires