Я застрял с этим кодом.
Я должен объявить класс, который имеет массив объектов в качестве атрибута, и этот объект также имеет предшествующий класс в качестве атрибута.
Я получил:
ошибка: неправильное использование неполного типа ‘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;
}
В Categoria.cpp
Вы должны #include "Tarjeta.h"
,
Заголовки в порядке, но в cpp
Если вы действительно используете класс — предварительное объявление недостаточно, вам нужно включить.
Других решений пока нет …