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 に答える