0

我被这段代码困住了。我必须声明一个具有对象数组作为属性的类,并且该对象还具有先前的类作为属性。

我得到:错误:不完整类型“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="";
  }

分类.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

分类.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;

}
4

1 回答 1

2

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

标题很好,但是在cpp您实际使用该类的文件中 - 前向声明是不够的,您需要包含。

于 2012-12-24T19:50:41.943 回答