[C con Clase] Problema con declaración de objeto

Steven Davidson srd4121 en njit.edu
Sab Mayo 24 06:44:59 CEST 2008


Hola Kyosuke,

Kyosuke Kasuga wrote:
> Hi!!!, k tal todos?, bueno al grano, tengo un programita en C++ hecho
> en wxDev-C++, en donde tengo 1 archivo de recursos, otro de
> declaraciones y 2 archivos de código con extensión CPP, mi problema
> es que en uno de mis archivos de código tengo declarada una clase,
> pero cuando la llamo desde el otro archivo de código, que es donde
> tengo mi funcion WinMain, me sale un error, y no capto como sacarlo,
> el error que me envia es el siguiente:
>  
> "aggregate `BaseDatos MiBase' has incomplete type and cannot be
> defined"
>  
> Mi clase se llama BaseDatos y mi objeto se llama MiBase, y quiero 
> declarar a miBase como un objeto global (publico), en el archivo de 
> código donde esta el WinMain le pongo lo siguiente en la parte de 
> declaraciones;
>  
> class Basedatos;
>  
> Pero igual no me funciona, como ya dije antes tengo definida la clase
> en el otro archivo de código, que se encarga especificamente de
> trabajar con MySQL.  Cualquier ayuda lo agradecería mucho.
>  

El problema está en que el compilador no puede instanciar tu objeto 
porque no tiene la definición completa de la clase 'BaseDatos'. 
Principalmente, necesita saber la cantidad de bytes que tu objeto va a 
ocupar y con 'class BaseDatos;' no es suficiente información.

Intenta incluir "BaseDatos.h" o donde tengas la definición completa de 
la clase; o sea, algo más de información que simplemente indicar que se 
trata de una clase. Si no puedes, entonces necesitarás usar un puntero 
al objeto. Por ejemplo,

BaseDatos *pMiBase;

De todas maneras, no comprendo por qué no puedes dar la definición 
entera de la clase 'BaseDatos'. Sospecho que has escrito la definición 
de la clase en el ".cpp" y no en el ".h". Deberías tener algo así:

// "BaseDatos.h"

#ifndef _BASEDATOS_H_
#define _BASEDATOS_H_

#include <mysql.h>  // Posiblemente

class BaseDatos
{
public:
   BaseDatos();
   ~BaseDatos();
   ...
};

#endif _BASEDATOS_H_


// "BaseDatos.cpp"

#include "BaseDatos.h"
#include <mysql.h>  // Seguro

BaseDatos::BaseDatos()
{
...
}
~BaseDatos::BaseDatos()
{
...
}
...

En el otro código fuente que contiene 'WinMain()', tendrías el siguiente 
esquema:

// "programa.cpp"

#include <windows.h>
#include "BaseDatos.h"
//#include <mysql.h>  // Seguramente no

WinMain(...)
{
...
}

WinProc(...)
{
...
}


Como puedes ver, necesitas incluir "BaseDatos.h" con la definición 
completa de la clase 'BaseDatos', pero no necesariamente las 
definiciones de sus funciones miembro. Las implementaciones son 
necesarias en el enlazado, cuando el enlazador las requiere.


Espero que esto aclare la duda.

Steven







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