C++ 无效使用不完整的c类++;?
我被这个密码困住了。 我必须声明一个类,该类的属性为对象数组,该对象的属性也为前一个类 我得到: 错误:不完整类型“struct Tarjeta”的使用无效 错误:“struct Tarjeta”的转发声明| 塔吉塔C++ 无效使用不完整的c类++;?,c++,forward-declaration,C++,Forward Declaration,我被这个密码困住了。 我必须声明一个类,该类的属性为对象数组,该对象的属性也为前一个类 我得到: 错误:不完整类型“struct Tarjeta”的使用无效 错误:“struct Tarjeta”的转发声明| 塔吉塔 #include "../include/Categoria.h" class Tarjeta{ public: ~Tarjeta(); //constructor por defecto Tarjeta(); //construc
#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
\ifndef CATEGORIA\u H
#定义范畴
#包括
#定义MAXTARJETAS 50
使用名称空间std;
//关于分类法的声明
Tarjeta类;
A类
{
公众:
虚拟~Categoria();
//建造商对类别的缺陷
范畴();
//类别参数构造
范畴(字符串,字符串);
//作为一个空值的组织的职能
无效的附带条件();
//我们的职能是在塔吉塔学院引进新的塔吉塔
无效的塔吉塔(塔吉塔);
//最后一场比赛中没有任何一场比赛
Tarjeta consultaTarjeta(字符串);
//塔吉塔斯和埃利米纳的布斯卡阵列,没有埃斯图迪奥
void elminatarjeta(字符串);
受保护的:
字符串名称;
字符串描述;
塔吉塔*arrayTarjetas;
私人:
};
#endif//CATEGORIA\u H
类别a.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;
}
#include“./include/Categoria.h”
#包括
#定义MAXTARJETAS 50
使用名称空间std;
/**@brief-elminatarjeta
*
*塔吉塔斯和埃利米纳的布斯卡阵列,没有埃斯图迪奥
*/
void Categoria::elminatarjeta(字符串描述)
{
int i=0;
bool-encontrado=false;
而(arrayTarjetas[i].description!=description&&i在Categoria.cpp
中,您必须#包括“Tarjeta.h”
标题很好,但是在cpp
文件中,您实际使用了类-转发声明是不够的,您需要包含。您没有数组作为成员,而是通过指针附加。这非常重要,因为任何类都不能包含自身的数组(您会遇到轻微的递归大小问题).刚刚得出了同样的结论