Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    [C++] Problema inclusione header

    Come posso fare per permettere a due file di includersi a vicenda?

    Faccio un esempio così mi spiego:

    Ho due classi A e B, dichiarate rispettivamente dentro a A.h e B.h.
    Sia A che B hanno al loro interno un puntatore ad una variabile del tipo dell'altra classe.

    A.h
    codice:
    #ifndef A_H
    #define A_H
    
    #include"B.h"
    
    class A{
          B *b;
    };
    
    #endif
    B.h
    codice:
    #ifndef B_H
    #define B_H
    
    #include"A.h"
    
    class B{
          A *a;    
    };    
    
    #endif
    Però questo non funziona e in un ipotetico main.cpp
    codice:
    #include"A.h"
    
    int main(int argc, char *argv[]){
        A a();
        return 0;
    }
    Non mi riconosce il tipo A dentro a B.h.
    Suppongo sia "colpa" dei #ifndef #define, tuttavia se non li metto i due file si includono a vicenda all'infinito e ovviamente non funziona.

    Questo l'ho provato creando progetti sia con Dev-C++ sia con CodeBlocks.

    Come si risolve in queste situazioni?
    Grazie.

  2. #2

    Re: [C++] Problema inclusione header

    Forward declaration:

    Codice PHP:
    #ifndef A_H
    #define A_H

    #include"B.h"

    class B;
    class 
    A{
          
    *b;
    };

    #endif 
    Codice PHP:
    #ifndef B_H
    #define B_H

    #include"A.h"
    class A;
    class 
    B{
          
    *a;    
    };    

    #endif 

  3. #3
    Ok, grazie mille! ^^

  4. #4
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    A mio parere l'inclusione di file a vicenda è una tecnica sbagliata, anche se non ha effetti collaterali, dato che le direttive preprocessore salvano la situazione.

    Se includi il file B nel file A, e se nel file B ti serve una classe dichiarata nel file A, farai

    codice:
    class A; //Dichiarazione anticipata
    //Tuo codice
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  5. #5
    In alcuni casi però è inevitabile fare così, ad esempio quando in un file di header ci sono delle funzioni membro inline che usano membri di un'altra classe definita in un altro header (caso piuttosto comune).
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Non mi è chiaro il caso che mi hai presentato...faresti un esempio?
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  7. #7
    codice:
    //A.h
    #ifndef A_H_INCLUDED
    #define A_H_INCLUDED
    class A
    {
        //Un valore inutile
        int dummy;
    public:
        A(int Dummy);
        inline int GetDummy()
        {
            return dummy;
        };
    };
    #endif
    codice:
    //A.cpp
    #include "A.h"
    A::A(int Dummy)
    {
        dummy=Dummy;
    }
    codice:
    //B.h
    #ifndef
    #include "A.h"
    #ifndef B_H_INCLUDED
    #define B_H_INCLUDED
    class B
    {
        A oggettoA;
    public:
        B(int Dummy) : oggettoA(Dummy) //già per fare questo è necessario che il compilatore sappia che c'è un costruttore di A che accetta un int
        {
            //...
        };
        inline int GetValue()
        {
            return oggettoA.GetDummy()*10; //per fare questo è necessario che il compilatore conosca A::GetValue().
        };
    };
    #endif
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Il problema iniziale sarebbe risolto, però ora mi sta sorgendo un dubbio più generale su come sia più conveniente strutturare il tutto. Dato che son qui vi sfrutto un po' e provo a rubarvi qualche dritta dato che mi accorgo di avere le idee parecchio confuse quando devo analizzare un problema e cercare di buttare giù una soluzione con classi varie.

    Ho iniziato da poco a fare un programma per giocare a scacchi, dato che mi sembrava un esercizio adatto per sperimentare praticamente un po' di programmazione ad oggetti.
    Ho diviso il tutto in varie classi (Partita, Giocatore, Pedina, Casella), ognuna delle quali ha propri metodi ed attributi. Però ognuna di queste classi non ha vita a sè ed ha bisogno delle altre per poter funzionare. Io avevo messo ognuna di queste classi in un proprio file (es. partita.h, partita.cpp, giocatore.h, giocatore.cpp ecc). Però ora mi sta sorgendo il dubbio di star sbagliando "tutto" concettualmente...dovrei tenerle tutte nello stesso file dato che devono cooperare così da vicino? E' corretto fare delle classi così che dipendono l'una dall'altra a vicenda?
    Sono molto alle prime armi con la programmazione ad oggetti, quindi preferirei provare a togliermi questi dubbi prima e non finire per fare programmazione strutturata come in C usando le classi come se fossero struct...

    Originariamente inviato da XWolverineX
    A mio parere l'inclusione di file a vicenda è una tecnica sbagliata
    Perché? Come pensi sarebbe meglio fare in un programma come quello citato sopra?

  9. #9
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Non ho capito bene il tuo esempio...non vedo l'inclusione a vicenda inevitabile di cui stiamo parlando.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  10. #10
    Non avevo capito che stavi parlando di inclusione a vicenda, credevo che dicessi in generale includere un header di una classe in quello di un'altra. Be', allora sono d'accordo con te, è una tecnica che in generale andrebbe evitata, visto che causa più problemi che altro.
    Amaro C++, il gusto pieno dell'undefined behavior.

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.