Je me suis récemment retrouvé coincé dans une situation comme celle-ci:
class A
{
public:
typedef struct/class {...} B;
...
C::D *someField;
}
class C
{
public:
typedef struct/class {...} D;
...
A::B *someField;
}
Habituellement, vous pouvez déclarer un nom de classe:
class A;
Mais vous ne pouvez pas déclarer un type imbriqué, ce qui suit provoque une erreur de compilation.
class C::D;
Des idées?
c++
class
nested
forward-declaration
Calmarius
la source
la source
Réponses:
Vous ne pouvez pas le faire, c'est un trou dans le langage C ++. Vous devrez annuler l'imbrication d'au moins une des classes imbriquées.
la source
J'avais besoin d'une référence directe comme:
Ma solution était:
Plus tard, quand je pourrais utiliser la définition complète:
Cette technique serait probablement plus problématique qu'elle n'en vaut s'il y avait des constructeurs compliqués ou d'autres fonctions membres spéciales qui n'étaient pas héritées en douceur. Je pouvais imaginer que certains modèles de magie réagissaient mal.
Mais dans mon cas très simple, cela semble fonctionner.
la source
using basename::basename;
dans la classe dérivée, donc pas de problème avec les cteurs compliqués.typedef
à l'intérieur de la classeSi vous voulez vraiment éviter # d'inclure le fichier d'en-tête désagréable dans votre fichier d'en-tête, vous pouvez le faire:
fichier hpp:
fichier cpp
Mais alors:
Alors, oui, compromis ...
la source
hpp
fichier?Cela peut être fait en déclarant la classe externe comme un espace de noms .
Exemple: Nous devons utiliser une classe imbriquée others :: A :: Nested in others_a.h, qui est hors de notre contrôle.
others_a.h
my_class.h
my_class.cpp
la source
a::b
est modifié de la même manière, qu'il s'agisse dea
classe ou d'espace de noms.Je n'appellerais pas cela une réponse, mais néanmoins une découverte intéressante: si vous répétez la déclaration de votre structure dans un espace de noms appelé C, tout va bien (en gcc au moins). Lorsque la définition de classe de C est trouvée, elle semble remplacer silencieusement le namspace C.
la source
Ce serait une solution de contournement (au moins pour le problème décrit dans la question - pas pour le problème réel, c'est-à-dire lorsqu'il n'a pas le contrôle sur la définition de
C
):la source
Si vous avez accès pour modifier le code source des classes C et D, vous pouvez supprimer la classe D séparément et saisir un synonyme pour celle-ci dans la classe C:
la source