2011-06-22 10 views
12

Mi Problema:declaración hacia adelante y espacios de nombres (C++)

consiguió dos clases, las clases A y B, así que me dieron A.h y a.cpp y B.h y B.cpp. Un necesita saber B y B necesita saber A. Lo resuelto de la siguiente manera (No sé por qué tiene que ser tan ...)

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" 

Utilicé una declaración directa y funciona.

El problema es que ambas clases deben estar en el espacio de nombres "ui". O por lo menos creo que este es el significado:

A.h:

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

class A{ ... 

B.h:

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

class B{ ... 

Esto ya no funciona. ¿Qué tengo que hacer ahora para que funcione nuevamente con el espacio de nombres y la declaración de reenvío?

Ambos tienen que estar en este espacio de nombres. Estoy trabajando con Qt y las líneas "namespace ui {" etc. son necesarias. Y ambas clases necesitan conocerse. Ya he intentado sólo para hacer esto:

namespace ui{ 
class A; 
class B; 
} 

en ambas cabeceras, pero esto no funciona ...

Por cierto: Todo encabezado y archivos también tiene la "ifndef" -Mecanismo.

+3

¿Qué significa "Esto no funciona más." Por favor, publique los errores exactos del compilador/enlazador – fredoverflow

Respuesta

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

Ya casi está allí. Esto debería funcionar:

// A.h 
namespace ui { 

class B; 
class A { 
    ... 
}; 

} // namespace ui 

y

// B.h 
namespace ui { 

class A; 
class B { 
    ... 
}; 

} // namespace ui 

La única cosa que tienes mal es que usted tiene que definir las clases dentro del espacio de nombres; no es suficiente para reenviar: declararlos dentro del espacio de nombres.

+0

No puedo hacer esto. Este es el texto autogenerado por QT- Diseñador. Simplemente hace esto. No sé por qué. Por cierto, también en mi primer ejemplo que declaro que funciona también necesito dos declaraciones avanzadas. – Obs

+0

¿Habrá notado que tiene tres respuestas que dicen casi exactamente lo mismo? la única forma de hacerlo funcionar. Si no se puede persuadir a QT-Designer para que coloque sus definiciones de clase dentro del bloque "' namespace ui {'...'} '", entonces estas atrapado con esas clases en el espacio de nombres global. – zwol

13

Si he entendido bien, se declara 2 tipos diferentes con una construcción de este tipo:

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

class A{ ... }; 

Aquí Estado que no es un class A en el espacio de nombres ui, pero se define una class A en el espacio de nombres global. Por lo tanto, ui::A se declara pero nunca se ha definido.Mueva la definición de A a la ui espacio de nombres, así:

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

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

Ésta es una pregunta muy específica en Qt.

Cuando Qt Designer autogenera el archivo de código para usted, el espacio de nombres Ui es un espacio de nombres separado de sus clases. En realidad, se declaran dos clases diferentes aquí: class A en el espacio de nombres global, y class Ui::A en el espacio de nombres Ui. La segunda clase contiene todos los controles que Qt genera para usted (cuando usa el diseñador de formularios), y la primera clase (en el espacio de nombres global) tiene toda su lógica.

La versión de Qt Creator que estoy usando (3.1) también generará un miembro privado para class A (no Ui::A): private: Ui::A* ui;, que está configurado con ui->setUp(this). A continuación, puede acceder a los controles (por ejemplo, ui->lineEdit->toPlainText();.

Cuestiones relacionadas