Avant la déclaration d'imbrication des types/classes en C++
J'ai récemment obtenu coincé dans une situation comme ceci:
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 avant un type imbriqué, les causes suivantes erreur de compilation.
class C::D;
Des idées?
- Pourquoi avez-vous besoin? Notez que vous pouvez déclarer avant si c'est un membre de la même classe étant définie: class X { classe Y; Y *a; }; la classe X::Y { };
- Fascinant d'erreur.
- Cette solution a fonctionné pour moi (espace de noms C { classe D; };): stackoverflow.com/questions/22389784/...
- J'ai trouvé une solution lien
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas le faire, c'est un trou dans le langage C++. Vous aurez à onu-nid d'au moins une des classes imbriquées.
J'avais besoin d'une référence vers l'avant comme:
Ma solution est:
Plus tard quand je pourrais utiliser la définition complète:
Cette technique serait probablement plus d'ennuis que cela vaut la peine si il y avait compliqué les constructeurs ou les autres fonctions membres qui n'ont pas hérité de la douceur. Je ne pouvais imaginer un certain nombre de modèles de la magie réagit mal.
Mais dans mon cas très simple, il semble fonctionner.
using basename::basename;
dans la classe dérivée, donc pas de problème avec compliqué ctors.typedef
à l'intérieur de la classeSi vous voulez vraiment éviter #, y compris le méchant fichier d'en-tête dans votre fichier d'en-tête, vous pourriez faire ceci:
php fichier:
fichier cpp
Mais alors:
Donc, oui, les compromis...
hpp
fichier?Cela peut être fait par déclarer avant que l'extérieur de la classe comme un espace de noms.
De l'échantillon: Nous devons utiliser une classe imbriquée autres::A::niché dans others_a.h, qui est hors de notre contrôle.
others_a.h
my_class.h
my_class.cpp
a::b
est mutilé de la même manière, peu importe sia
est de la classe ou de l'espace.Je n'appellerais pas cela une réponse, mais néanmoins intéressant de trouver:
Si vous répétez la déclaration de votre structure dans un espace de noms appelé C, tout va bien (dans gcc au moins).
Lors de la définition de classe de C est trouvé, il semble silencieusement remplacer le namspace C.
Ce serait une solution (au moins pour le problème décrit dans la question, pas pour le problème réel, c'est à dire, quand ne pas avoir le contrôle sur la définition de
C
):Si vous avez la possibilité de modifier le code source des classes C et D, alors vous pouvez prendre de la classe D séparément, et entrez un synonyme pour elle de classe C: