Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177

    [C++] direttive al compilatore

    La situazione potrebbe essere schematizzata nel seguente modo:

    header file "A.h" in cui definisco la classe A e relativo A.cpp

    header file "B.h" in cui definisco la classe B e relativo B.cpp.

    header file "C.h" in cui definisco la classe C e relativo C.cpp.

    Poniamo il caso che la classe B sia fatta cosi'
    codice:
    class B
    {
      //...
      private:
        A* mA;
    };
    Quindi in B.h metto #include "A.h"

    La classe C invece, potrebbe essere fatta cosi'
    codice:
    class C
    {
      //...
      void metodo(/*...*/);
      private:
        //...
    };
    e la definizione di metodo, in C.cpp necessita della creazione di un oggetto temporaneo A, quindi sara' fatto cosi'
    codice:
    void C::metodo(/*...*/)
    {
      A temporaneo;
      //...
    }
    C'e' quindi bisogno di includere A.h, e fino ad ora ho messo #include A.h nel file C.cpp, ma ora mi viene il dubbio: e' piu' corretto metterlo in C.h o in C.cpp?

    Grazie

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    In C.cpp, a meno che in C.h si usi una funzione inline che ha bisogno di un oggetto A fatto e finito.
    Se invece in C.h hai bisogno di dichiarare solo un puntatore ad A basta una forward declaration.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177
    Quote Originariamente inviata da shodan Visualizza il messaggio
    In C.cpp, a meno che in C.h si usi una funzione inline che ha bisogno di un oggetto A fatto e finito.
    Se invece in C.h hai bisogno di dichiarare solo un puntatore ad A basta una forward declaration.
    Quindi ho sempre sbagliato..., perche' se ricadevo nel primo caso, quindi la maggior parte delle volte, mettevo l'include nel file.h, perche' poi nel file .cpp avevo comunque bisogno di conoscere quello che andavo ad includere.

    Ricapitolando, nel file pippo.h, se mi serve solo sapere che esiste una classe XXX, metto una forward declaration, mentre in pippo.cpp faccio tutti gli include che mi servono, altrimenti l'include va messo per forza in pippo.h.

    Ovviamente ci sara' da qualche parte una sorta di decalogo, regole, prassi consolidata (e con le sue buone motivazioni ovviamente) da andare a studiarsi, consultare in caso di dubbi: sapresti darmi qualche consiglio?

    Grazie nuovamente

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Non c'è un modo "standard" se è questo che intendi, ma dipende dal contesto.
    Le forward declaration servono per due motivi: il primo è spezzare le dipendenze circolari tra header file (A include B che a sua volta include A), la seconda è velocizzare i tempi di compilazione. Ma solo il primo motivo rende obbligatorie le forward declaration.
    Nel tuo esempio:
    codice:
    class B
    {
      //...
      private:
        A* mA;
    };
    a B non interessa com'è fatta la classe A e nemmeno al compilatore, perché è sufficiente sapere che esiste un qualcosa che si chiama A di cui bisogna gestire il puntatore. Eventualmente sarà in B.cpp che B deve sapere come è fatto A.

    Diversamente se ci fosse stato scritto:
    codice:
    class B
    {
      //...
      private:
        A mA;
    };
    allora si che B deve sapere come è fatto A, altrimenti non saprebbe come costruirlo.
    Ricapitolando: se le dichiarazioni delle classi contengono solo dei puntatori a qualcosa (nel nostro caso A*) è sufficiente una forward declaration, viceversa se le dichiarazioni delle classi contengono oggetti fatti e finiti (ad esempio A) è obbligatorio inserire il corrispondente .h.
    Ma ambedue i modi non sono ne obbligatori ne sbagliati, a meno che non si verifichino dipendenze circolari, nel qual caso si può solo usare la forward declaration.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

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.