c++ - 不完整类 c++ 的无效使用?

标签 c++ forward-declaration

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

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

}

最佳答案

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

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

关于c++ - 不完整类 c++ 的无效使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14025188/

相关文章:

c++ - 将 unique_ptr 作为对插入 vector 中

C++ 在函数参数中正确使用结构

c++ - 为什么当我做一个小的改变时,我会收到错误消息说事情没有被宣布?当他们是

C++前向声明和不完整类型

c - 如何转发声明一个以函数指针作为参数的函数?

c++ - 如何在同一个类中转发声明一个函数?

c++ - 前向声明和友元函数

c++ - 如何发送和接收特定字符 winsock

c++ - 在 QtCreator 中添加静态 .a 库

c++ - 使用 Qt ItemDelegate