C++ dichiarazione di classe anticipata forward

di il
11 risposte

C++ dichiarazione di classe anticipata forward

Ciao a tutti,
sto studiando la dichiarazione di classe anticipata ( forward ) e ho qualche problema.

Ho capito che funziona come le dichiarazione di classe ma con la differenza che permette le dipendenze circolari.

Tuttavia non sono riuscito a creare un esempio funzionante, potete aiutarmi?

Grazie
Lele

11 Risposte

  • Re: C++ dichiarazione di classe anticipata forward

    Esempio. leggi bene ciò che è scritto.
  • Re: C++ dichiarazione di classe anticipata forward

    Ok domanda banale, le intestazioni le metto sempre nel .h? come# include?

    Ti faccio qst domanda xè ho trovato dei forward dichiarate nei .cpp e la cosa mi ha lasciato perplesso.
    grazie
    Lele
  • Re: C++ dichiarazione di classe anticipata forward

    Fai un esempio. Se la dichiarazione sta in .cpp c'è qualcosa che non va, almeno che non sia definito un define o una variabile locale.
  • Re: C++ dichiarazione di classe anticipata forward

    X gli esempi sul momento no li ho sotto mano.

    Di norma è meglio utilizzare SOLO le dichiarazioni classiche? o quelle anticipate?
  • Re: C++ dichiarazione di classe anticipata forward

    Dipende dalla complessità del progetto. Io di soito uso quelle classiche. se non posso fare a meno uso il forward.
  • Re: C++ dichiarazione di classe anticipata forward

    Ciao
    ancora ho delle difficoltà nel scrivere correttamente il codice mi aspettavo di riuscire ad accedere alla classe base ma nulla.

    Per quale motivo e in quale contesto puo essere utile utlizzare le forward .
    Lele
    #include "derivata.h"
    
    int main(int argc, char *argv[])
    {
    
    }
    
    
    // derivata.cpp
    // in uno di questi posti mi aspettavo di poter accere algli elementi di base.h ma nulla
    
    #include "derivata.h"
    
    derivata::derivata()
    {
    
    }
    
    void derivata::derivataTre (){
        
    }
    
    void derivata::derivataUno(base *uno){
        
    }
    
    void derivata::derivataDue(base &due){
    
    }
    
    // Derivata.h
    #ifndef DERIVATA_H
    #define DERIVATA_H
    //#include <base.h>
    
    class base;
    
    //class derivata : public base
    
    class derivata
    {
    public:
        base *uno;
        derivata();
    
        void derivataUno(base *uno);
        void derivataDue(base &due);
        void derivataTre();
    };
    
    #endif // DERIVATA_H
     
    
    // base.h
    #ifndef BASE_H
    #define BASE_H
    #include <iostream>
    using std::cout;
    
    class base
    {
    public:
        base();
        void baseUno();
    };
    
    #endif // BASE_H
    
    //Base.cpp
    #include "base.h"
    
    base::base()
    {
    }
    
    void base::baseUno(){
        cout << "baseUno\n";
    }
    
  • Re: C++ dichiarazione di classe anticipata forward

    Fai un esempio. Se la dichiarazione sta in .cpp c'è qualcosa che non va, almeno che non sia definito un define o una variabile locale.
    eccoti l'esempio di cui parlavo queste forward mi mandano un po fuori strada.

    Grazie
    Lele

    Perché Egg* layEgg(); è dichiarata in chicken.h
    
    // chicken.h
    
    #ifndef CHICKEN_H
    #define CHICKEN_H
    
    //class Egg;
    //start
    #include "egg.h"
    
    class Chicken {
     public:
        Egg* layEgg();
    };
    //end
    
    #endif        //  #ifndef CHICKEN_H
    
    Perché Chicken* getParent(); è dichiatata in egg.h
    
    // egg.h
    #ifndef EGG_H
    #define EGG_H
    //start
    class Chicken;              /* Forward class declaration. */
    class Egg {
     public:
        Chicken* getParent();   /* Okay in declarations if they are pointers. */ 
    };
    //end
    #endif        //  #ifndef EGG_H
    
    
    // egg.cpp
    #include "chicken.h"
    #include "egg.h"
    
    Chicken* Egg::getParent() {
        return new Chicken(); /* Requires definition of Chicken. */   
    }
    
    
  • Re: C++ dichiarazione di classe anticipata forward

    Chicken sa tutto del Egg perche ha incluso il .h. Evidentemente li serve anche lavorarci su con queto puntatore.
    dal altro canto Getparent() vuole un puntatore al padre che dev'essere di tipo Chicken. Al compilatore nel .h non interessa com'è definito Chicken per quello che usi il forward. Nel cpp li serve per sapere che entita sta ritornando la funzione e per chiamare il constructor tramite il new.
    Insomma il forward serve per velocizzare il lavoro del compilatore e per non evere inclusioni cicliche.
  • Re: C++ dichiarazione di classe anticipata forward

    Scusami se insisto ma ancora non riesco "adattare" forward al mio primo esempio.
    Puoi corrermi dove ho sbagliato? io proprio non ci riesco.

    Mi serve proprio una cosa banale una relazioni bidirezionale funzionante

    Grazie
    lele
  • Re: C++ dichiarazione di classe anticipata forward

    Eccoti:
    Main
    #include <iostream>
    #include "derivata.h"
    #include "base.h"
    
    int main(int argc, char *argv[])
    {
    	derivata d;
    	base b;
    	d.derivataUno(&b);
    }
    
    base.h
    // base.h
    #ifndef BASE_H
    #define BASE_H
    
    
    class base
    {
    public:
    	base();
    	void baseUno();
    };
    
    #endif // BASE_H
    
    base.cpp
    //Base.cpp
    #include "base.h"
    #include <iostream>
    
    base::base()
    {
    }
    
    void base::baseUno(){
    	std::cout << "BaseUno\n";
    }
    
    derivata.h
    // Derivata.h
    #ifndef DERIVATA_H
    #define DERIVATA_H
    //#include <base.h>
    
    class base;
    
    //class derivata : public base
    
    class derivata
    {
    public:
    	base *uno;
    	derivata();
    
    	void derivataUno(base *uno);
    	void derivataDue(base &due);
    	void derivataTre();
    };
    
    #endif // DERIVATA_H
    
    derivata.cpp
    // derivata.cpp
    // in uno di questi posti mi aspettavo di poter accere algli elementi di base.h ma nulla
    
    #include "derivata.h"
    #include "base.h"
    
    derivata::derivata()
    {
    
    }
    
    void derivata::derivataTre (){
    
    }
    
    void derivata::derivataUno(base *uno){
    	uno->baseUno();
    }
    
    void derivata::derivataDue(base &due){
    	due.baseUno();
    }
  • Re: C++ dichiarazione di classe anticipata forward

    Scusami x il ritardo...
    lo guardo grazie mille
    Lele
Devi accedere o registrarti per scrivere nel forum
11 risposte