Ola, estou com um trabalho da faculdade para fazer e preciso implementar um diagrama UML com herancas:
 
	Meu problema é o seguinte quando implemento a Classe Crianca ela possui um atributo do tipo Adulto, e a classe Adulto possui um atributo do tipo Crianca. O que ocorre é no momento da compilacao parece que se defino antes a Classe Crianca o compilador acusa que Adulto não esta definido( imagino que isso ocorra devido o compilador compilar linha-a-linha e como a Classe Crianca foi definida primeiro ainda não há um registro da Classe Adulto. Se inverto a ordem de inclusão o compilador da o mesmo problema acusando que crianca ainda não está definido. Então o que fazer? Segue abaixo o cabeçalho simples do meu codigo sem funcoes da logica de vendas implementadas!
 
#ifndef USUARIO_H
#define USUARIO_H
#include <string>
#include <iostream>
using std::string;
using namespace std;
namespace Entities{
    //----------------------------- Classe-base usuario -----------------------------------
    class Usuario{
        protected:
        int id_;
        string nome_;
        int idade_;
        float saldo_;
        public:
        //Construtor padrão
        Usuario();
        
        //Cria novo usuario
        //Pre-Condicao: não pode ser instanciado como Usuario
        Usuario(int id,string nome,int idade,float saldo);
        //Retorna ID do usuario
        int getId();
        //Retorna nome do usuario
        string getNome();
        //Retorna idade do usuario
        int getIdade();
        //Retorna saldo do usuario
        float getSaldo();
        //Modifica saldo do usuario
        void setSaldo(float valor);
        //Imprime dados do Usuario
        //Funcao virtual pura -> define Usuario como classe abstrata
        virtual void toString() = 0;
    };
    //----------------------------- Classe Adulto -----------------------------------
    class Adulto : public Usuario{
        protected:
       Crianca *dependentes_;
        int numDependentes_;
        public:
        
        //Cria novo usuario adulto
        Adulto();
        //Cria novo usuario com atributos
        Adulto(int id,string nome,int idade,float saldo);
        //Cria adulto co dependentes
        Adulto(int id,string nome,int idade,float saldo, Crianca dependentes[], int numDependentes);
        //Torna Adulto uma classe instanciavel
        void toString() override;
        //Adiciona dependente
        void addDependente(Crianca *dependente);
        
    };
    //----------------------------- Classe Crianca -----------------------------------
    class Crianca: public Usuario{
    private:
    Adulto *responsavel_;
    
    public:
    
    //Construtor padrão
    Crianca();
    //Cria novo usuario Crianca
    Crianca(int id,string nome,int idade,float saldo,Adulto *responsavel);
    //Sobrescreve funcao toString e permite que Crianca seja uma classe instanciavel
    //Imprime na tela dados da crianca
    void toString() override;
    };
    //----------------------------- Classe Idoso -----------------------------------
    class Idoso : public Adulto{
    public:
    //Cria um novo Idoso
    Idoso();
    //Cria um novo idoso pre definiddo
    Idoso(int id,string nome,int idade,float saldo);
    };
}
#endif //USUARIO_H