2012-12-24 24 views
0

我被这段代码困住了。 我必须声明一个具有对象数组作为属性的类,并且此对象也具有先前的类作为属性。不完整的类C++的无效使用?

我得到: 错误:无效使用不完整的类型'struct Tarjeta' 错误:正向声明'struct Tarjeta'|

Tarjeta.h

#include "../include/Categoria.h" 


class Tarjeta{ 
    public: 

    ~Tarjeta(); 
    //constructor por defecto 
    Tarjeta(); 

    //constructor parametrizado 
    Tarjeta(string); 

    //Función para asignar categoria a la tarjeta 
    void asignarCategoria(Categoria); 

    //Función que devuelve la categoría en la que está incluida la tarjeta 
    Categoria obtenerCategoria(); 

    void desAsignar(); 
protected: 
    Categoria categoria; 
    string descripcion; 
    //identificador booleano para distinguir si una tarjeta del estudo ha sido asignada a una categoria 
    bool asiganda; 
private: 
}; 

Tarjeta.cpp

#include "../include/Tarjeta.h" 



Tarjeta::~Tarjeta() 
{ 
    //dtor 
} 

/** @brief desAsignar 
* 
* @todo: Funcion utlizada para sacar una tarjeta de una categoria 
*/ 
void Tarjeta::desAsignar(){ 
categoria=NULL; 
} 

/** @brief obtenerCategoria 
* 
* @todo: devuelve la categoria en la que esta incluida la tarjeta 
*/ 
Categoria Tarjeta::obtenerCategoria(){ 
    return categoria; 
} 

/** @brief asignarCategoria 
* 
* @todo: asigna una categoria a la tarjeta 
*/ 
void Tarjeta::asignarCategoria(Categoria cat){ 
    categoria=cat; 
    asiganda=true; 
} 

/** @brief Tarjeta 
* 
* @todo: constructor parametrizado. 
*  inicalizamos categoria a null para da la posibilidad de crear tarjetas sin    
*/ 
Tarjeta::Tarjeta(string des):descripcion(des){ 
    categoria=NULL; 
} 

/** @brief Tarjeta 
    * 
    * @todo: constructor por defecto 
    */ 
    Tarjeta::Tarjeta(){ 
    categoria=NULL; 
    descripcion=""; 
    } 

categoria.h

#ifndef CATEGORIA_H 
#define CATEGORIA_H 

#include <string> 
#define MAXTARJETAS 50 

using namespace std; 

//declaracion adelantada de Tarjeta para poder utilzarla en la clase Categoria 
class Tarjeta; 

class Categoria 
{ 
    public: 
     virtual ~Categoria(); 

     //Constructor por defecto de la clase Categoria 
     Categoria(); 

    //construcotr parametrizado de la clase Categoria 
    Categoria(string,string); 

    //Función que inicializa el arrayTarjetas poniendo las todas a null 
    void incializaArrayTarjetas(); 

    //Función que introduce una nueva tarjeta en la coleccion de tarjetas 
    void introducirTarjeta(Tarjeta); 

    //Busca en el array de tarjetas la tarjeta en cuestion y la devuelve. Si llega al final y no encuentra nada devuelve nill 
    Tarjeta consultaTarjeta(string); 

    //Busca en el array de tarjetas y la elimina del array, no del estudio 
    void elminarTarjeta(string); 
protected: 
    string nombre; 
    string descripcion; 
    Tarjeta *arrayTarjetas; 

private: 
}; 

#endif // CATEGORIA_H 

Categoria.cpp

#include "../include/Categoria.h" 
#include <string> 
#define MAXTARJETAS 50 

using namespace std; 

/** @brief elminarTarjeta 
    * 
    * Busca en el array de tarjetas y la elimina del array, no del estudio 
    */ 
void Categoria::elminarTarjeta(string descripcion) 
{ 
    int i=0; 
    bool encontrado=false; 
    while(arrayTarjetas[i].descripcion!=descripcion && i<MAXTARJETAS){ 
     i++; 
    } 
    if(arrayTarjetas[i].descripcion==descripcion){ 
     encontrado=true; 
    } 
    int j=i+1; 
    while(i<MAXTARJETAS){ 
     if(j<MAXTARJETAS){ 
      arrayTarjetas[i]=arrayTarjetas[j]; 
     } 
     i++; 
     j++; 
    } 
    if(encontrado){ 
     arrayTarjetas[MAXTARJETAS-1]=NULL; 
    } 
} 

/** @brief consultaTarjeta 
    * 
    * Busca en el array de tarjetas la tarjeta en cuestion y la devuelve. Si llega al final y no encuentra nada devuelve null 
    */ 
Tarjeta Categoria::consultaTarjeta(string descripcion) 
{ 
    int i=0; 
    while(arrayTarjetas[i].descripcion!=descripcion && i<MAXTARJETAS){ 
     i++; 
    } 
    if(arrayTarjetas[i].descripcion==descripcion){ 
     return arrayTarjetas[i]; 
    } 
    return NULL; 
} 

/** @brief introducirTarjeta 
    * 
    * Función que introduce una nueva tarjeta en la coleccion de tarjetas 
    * introduciremos la tarjeta en la primera posición libre que encontremos en el array 
    */ 
void Categoria::introducirTarjeta(Tarjeta tarjeta) 
{ 
    for(int i=0;i<MAXTARJETAS;i++){ 
     if(arrayTarjetas[i]==NULL){ 
      arrayTarjetas[i]=tarjeta; 
      //la tarjeta que introducimos le asignamos la categoria 
      //tarjeta.asignarCategoria(this); Lo hacemos en el main 
      break; 
     } 
    } 
} 

/** @brief incializaArrayTarjetas 
    * 
    * Función que inicializa el arrayTarjetas poniendo las todas a null 
    */ 
void Categoria::incializaArrayTarjetas() 
{ 
    for(int i=0;i<MAXTARJETAS;i++){ 
     arrayTarjetas[i]=NULL; 
    } 
} 

/** @brief Categoria 
    * 
    * constructor parametrizado de la clase Categoria 
    * creamos el array vacio y lo inicializamos de esta 
    * forma podemos empezar a meter tarjetas en las diferentes categorias 
    */ 
Categoria::Categoria(string nom, string des):nombre(nom),descripcion(des){ 
    arrayTarjetas=new Tarjeta[MAXTARJETAS]; 
    incializaArrayTarjetas(); 
    cout<<"Constructor categoria"<<endl; 
} 

/** @brief Categoria 
    * 
    * Constructor por defecto de la clase Categoria 
    */ 
Categoria::Categoria() 
{ 
    nombre=""; 
    descripcion=""; 
    arrayTarjetas=new Tarjeta[MAXTARJETAS]; 
    incializaArrayTarjetas(); 
    cout<<"constructor categoria"<<endl; 
} 

/** @brief (one liner) 
    * 
    * (documentation goes here) 
    */ 
Categoria::~Categoria() 
{ 
    delete arrayTarjetas; 

} 
+0

您没有数组作为成员,但通过指针连接。这非常重要,因为没有类可以包含自己的数组(您会遇到轻微的递归大小问题)。 –

回答

2

Categoria.cpp您必须#include "Tarjeta.h"

头文件很好,但在cpp文件中您实际使用的是类 - 前向声明是不够的,您需要include。

+1

刚刚得出同样的结论。 +1 –

相关问题