Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    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?

    Per quale motivo e in quale contesto puo essere utile utlizzare le forward .

    Grazie
    Lele


    codice:
    #include "derivata.h"
    
    int main(int argc, char *argv[])
    {
    
    }
    codice:
    // 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){
    
    }
    codice:
    // 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
    codice:
    // base.h
    #ifndef BASE_H
    #define BASE_H
    #include <iostream>
    using std::cout;
    
    class base
    {
    public:
        base();
        void baseUno();
    };
    
    #endif // BASE_H
    codice:
    //Base.cpp
    #include "base.h"
    
    base::base()
    {
    }
    
    void base::baseUno(){
        cout << "baseUno\n";
    }

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590

    Re: C++ & dichiarazione di classe anticipata forward

    Mi spieghi meglio il problema? Anche se non sembri aver capito l'ereditarietà...
    Poi cosa ti aspetti che faccia con il main vuoto?
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Mi spieghi meglio il problema? Anche se non sembri aver capito l'ereditarietà...

    Poi cosa ti aspetti che faccia con il main vuoto?
    Nel main non ho messo nulla perché avevo visto che di per se il programma non andava.

    codice:
    // 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){
    
    }
    Qui mi aspettavo di riuscire a accedere alla classe base tramite il forward, quindi sono partito dalla ereditarietà classica da qui ho fatto un po di esperimenti. tutti andati a male.

    Mi spieghi meglio il problema? Anche se non sembri aver capito l'ereditarietà...
    Speriamo di no......
    lele

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Se vuoi utilizzare un oggetto all'interno, di fatto incapsulandolo, devi istanziarlo:
    codice:
    derivata::derivata() {
      uno = new base;
    }
    
    derivata::~derivata() {
      delete uno;
    }
    inoltre c'è un'altro errore:
    in derivata.h ridefinisci la classe base, non devi farlo, hai incluso base.h
    codice:
    class base; //errato
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    Le dichiarazione forward mi mandano un po fuori strada.
    Partendo da questo esercizio ho cercato di ricreare le dichiarazioni anticipate ma con scarso successo.

    Grazie
    Lele

    Perché Egg* layEgg(); è dichiarata in chicken.h
    codice:
    // 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
    codice:
    // 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
    codice:
    // egg.cpp
    #include "chicken.h"
    #include "egg.h"
    
    Chicken* Egg::getParent() {
        return new Chicken(); /* Requires definition of Chicken. */   
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.