Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无效使用不完整的c类++;?_C++_Forward Declaration - Fatal编程技术网

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

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

我被这个密码困住了。 我必须声明一个类,该类的属性为对象数组,该对象的属性也为前一个类

我得到: 错误:不完整类型“struct Tarjeta”的使用无效 错误:“struct Tarjeta”的转发声明|

塔吉塔

#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
文件中,您实际使用了类-转发声明是不够的,您需要包含。

您没有数组作为成员,而是通过指针附加。这非常重要,因为任何类都不能包含自身的数组(您会遇到轻微的递归大小问题).刚刚得出了同样的结论