[C con Clase] Duda con namespace

Steven Davidson srd4121 en njit.edu
Mie Dic 1 16:06:54 CET 2010


Hola Leonel,

2010/11/30 Leonel Florin Selles <leonel06033 en cfg.jovenclub.cu>

> Hola amigos:
>
> como puedo utilizar un namespace creado por mi en una clase que no
> pertenece al namespace.


[CORTE]


> Yo también tengo incluido MyNameSpace dentro del main(), porque aqui
> tambien necesito utilizar estos obejtos, y por esta razon es que obtengo
> el error
>
> multiple definition of ObjetoClase1
> multiple definition of ObjetoClase2
>
> como puedo utilizar el namespace en varios lugares sin que suceda este
> error, por ejemplo cuando utilizo el "using namespace std;" este lo puedo
> agregar donde yo quiera que nunca me da esots problemas, que estoy
> haciendo mal, algun consejo, trabajo sobre KDEVELOP.


Realmente tienes tres problemas: dos errores y un problema del espacio
denominado.

Un error es lógico, acerca de las directivas del precompilador. Escribes:

#ifdef MYNAMESPACE_H
#define MYNAMESPACE_H
...

Cuando debería ser:

#ifndef MYNAMESPACE_H
#define MYNAMESPACE_H
...

Quieres comprobar el caso de que 'MYNAMESPACE_H' no exista, para poder
definirla.

El otro error de enlazado está en que defines dos objetos del mismo nombre
en el mismo espacio denominado y en el mismo ámbito. Esto contradice "la
regla de una sola definición" en C/C++. La solución es definir los objetos
una sola vez y luego redeclaralos donde los necesites. En tu caso, esto
sería,

// "MyNamaSpace.h"

#ifndef MYNAMESPACE_H
#define MYNAMESPACE_H

#include "clase1.h"
#include "clase2.h"

namespace MyNamaSpace
{
// Declaraciones
extern clase1 ObjetoClase1;
extern clase2 ObjetoClase2;
}

#endif

Y luego definimos estos objetos en otro fichero fuente, que puede ser por
ejemplo "MyNamaSpace.cpp", como mencionó Rubén; por ejemplo,

// "MyNamaSpace.cpp"

#include "MyNamaSpace.h"

 namespace MyNamaSpace
{
// Definiciones
clase1 ObjetoClase1;
clase2 ObjetoClase2;
}


En cuanto al otro problema, acerca del espacio denominado, simplemente
engloba los contenidos de ambos ficheros de cabecera que incluyes en
"MyNamaSpace.h"; esto es,

 // "MyNamaSpace.h"

#ifndef MYNAMESPACE_H
#define MYNAMESPACE_H

 namespace MyNamaSpace
{
#include "clase1.h"
#include "clase2.h"

// Declaraciones
extern clase1 ObjetoClase1;
extern clase2 ObjetoClase2;
}

#endif

Ahora las clases serán definidas en el espacio 'MyNamaSpace', pero solamente
desde dentro del fichero de cabecera "MyNamaSpace.h". Si #incluyes los otros
dos ficheros de cabecera directamente en otro ficheros, entonces esas
definiciones serán globales.


Espero que todo esto aclare las dudas.

Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20101201/9642d53d/attachment.html>


Más información sobre la lista de distribución Cconclase