предварительное объявление — недопустимое использование неполного класса 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

Решение

В Categoria.cpp Вы должны #include "Tarjeta.h",

Заголовки в порядке, но в cpp Если вы действительно используете класс — предварительное объявление недостаточно, вам нужно включить.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]