transmettre la déclaration et les espaces de noms (c ++)
Mon Problème:
Ai deux classes, la classe A et de B, donc je me suis A. h et A.cpp et B. h et B.cpp.
Un besoin de savoir B et B doit savoir A. je l'ai résolu de la façon suivante (je ne sais pas pourquoi il doit en être ainsi...)
A. h:
#include "B.h"
class A{ ...
A.cpp:
#include "A.h"
B. h:
#include "A.h"
class A; //forward declaration
class B { ...
B.cpp:
#include "B.h"
J'ai utilisé une à l'avant de la déclaration, et cela fonctionne.
Le Problème, c'est que les deux classes ont besoin d'être dans l'espace de noms "interface utilisateur". Ou, au moins, je pense que c'est le sens:
A. h:
#include "B.h"
namespace ui{
class A;
}
class A{ ...
B. h:
#include "A.h"
namespace ui{
class B;
}
class B{ ...
Cela ne fonctionne pas plus. Que dois-je faire maintenant pour le faire fonctionner à nouveau avec de l'espace de noms et la déclaration anticipée?
Les deux doivent être dans cet espace de noms. Je travaille avec Qt et les lignes "namespace ui{" etc. sont nécessaires. Et les deux classes ont besoin de savoir les uns des autres.
J'ai déjà essayé juste pour faire ceci:
namespace ui{
class A;
class B;
}
dans les deux-têtes, mais cela ne fonctionne pas...
Btw: Tous les en-Tête des Fichiers aussi eu la "ifndef"-mécanisme.
source d'informationauteur Obs | 2011-06-22
Vous devez vous connecter pour publier un commentaire.
Si je vous comprends bien, vous déclarez 2 types différents avec une telle construction:
Ici vous qu'il y a une
class A
dans l'espace de nomsui
mais vous définissez unclass A
dans l'espace de noms global. Doncui::A
est déclarée, mais jamais défini. Déplacer la définition deA
à laui
espace:Vous y êtes presque. Cela devrait fonctionner:
et
La seule chose que vous avez mal, c'est que vous avez à définir les classes à l'intérieur de l'espace de noms; il ne suffit pas de déclarer à l'intérieur de l'espace de noms.
C'est un très Qt question spécifique.
Lorsque Qt Designer génère automatiquement le fichier de code pour vous, le
Ui
espace de noms est séparé de l'espace de noms de vos classes. Il y a en fait deux classes différentes d'être déclaré ici:class A
dans l'espace de noms global, etclass Ui::A
dans leUi
espace de noms. La deuxième classe contient tous les contrôles qui Qt génère pour vous (lorsque vous utilisez le concepteur de formulaire), et la première classe (dans l'espace de noms global) a tous de votre logique.La version de Qt Creator, je suis à l'aide de (3.1) permettra également de générer un membre privé pour
class A
(pasUi::A
):private: Ui::A* ui;
qui est le programme d'installation avecui->setUp(this)
. Vous pouvez ensuite les contrôles d'accès (par exemple,ui->lineEdit->toPlainText();
.