2011-06-22 4 views
12

Mon problème:déclaration avant et namespaces (C++)

obtenu deux classes, la classe A et B, alors je suis A.h et A.cpp et B.h et B.cpp. A besoin de savoir B et B a besoin de savoir A. Je l'ai résolu de la manière suivante (je ne sais pas pourquoi il doit être si ...)

Ah:

#include "B.h" 
class A{ ... 

A. cpp:

#include "A.h" 

Bh:

#include "A.h" 
class A; // forward declaration 
class B { ... 

B.cpp:

#include "B.h" 

J'utilise une déclaration avant et cela fonctionne.

Le problème est que les deux classes doivent être dans l'espace de noms "ui". Ou du 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 plus. Que dois-je faire maintenant pour le faire fonctionner à nouveau avec l'espace de noms et la déclaration directe?

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 se connaître. je l'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-Files a également obtenu le « ifndef » -Mécanisme.

+3

Qu'est-ce que "Cela ne fonctionne plus." Signifie? S'il vous plaît signaler les erreurs exactes de compilateur/éditeur de liens – fredoverflow

Répondre

6
// A.h 
namespace ui { 
    class A; // forward 
    class B { 
    }; 
} 



// B.h 
namespace ui { 
    class B; // forward 
    class A { 
    }; 
} 



// A.cpp 
#include "A.h" 
#include "B.h" 



// B.cpp 
#include "A.h" 
#include "B.h" 
3

Vous y êtes presque. Cela devrait fonctionner:

// A.h 
namespace ui { 

class B; 
class A { 
    ... 
}; 

} // namespace ui 

et

// B.h 
namespace ui { 

class A; 
class B { 
    ... 
}; 

} // namespace ui 

La seule chose que vous avez tort est que vous devez définir les classes à l'intérieur de l'espace de noms; il ne suffit pas de les déclarer à l'intérieur de l'espace de noms.

+0

Je ne peux pas faire ceci. Je ne sais pas pourquoi, dans mon premier exemple que j'ai déclaré comme fonctionnant j'ai aussi besoin de deux déclarations avant – Obs

+0

Vous avez peut-être remarqué que vous avez obtenu trois réponses toutes disant presque exactement la même chose? Si QT-Designer ne peut pas être persuadé de placer ses définitions de classe dans le bloc "' namespace ui {'...'}} ", alors vous êtes coincé avec ces classes dans le espace de noms global. – zwol

13

Si je vous comprends bien, vous déclarez 2 différents types avec une telle construction:

#include "B.h" 
namespace ui{ 
    class A; 
} 

class A{ ... }; 

Ici vous dites qu'il ya un class A dans l'espace de noms ui, mais vous définissez un class A dans l'espace de noms global. Par conséquent ui::A est déclaré mais jamais défini.Déplacer la définition de l'espace de noms A à ui ainsi:

#include "B.h" 
namespace ui{ 
    class A; 
} 

//somewhere later: 
namespace ui 
{ 
    class A{ ... }; 
} 
0

Ceci est une question très spécifique Qt. Lorsque Qt Designer génère automatiquement un fichier de code pour vous, l'espace de noms Ui est un espace de noms distinct de vos classes. Deux classes différentes sont actuellement déclarées ici: class A dans l'espace de noms global et class Ui::A dans l'espace de noms Ui. La deuxième classe contient tous les contrôles que Qt génère pour vous (lorsque vous utilisez le concepteur de formulaires), et la première classe (dans l'espace de noms global) a toute votre logique.

La version de Qt Creator J'utilise (3.1) va également générer un membre privé pour class A (non Ui::A): private: Ui::A* ui;, qui est configuré avec ui->setUp(this). Vous pouvez ensuite accéder aux contrôles (par exemple, ui->lineEdit->toPlainText();