Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2015
    Messaggi
    4

    [C++] classi annidate e file header

    Ciao a tutti,

    scrivo perchè non riesco a risolvere un problema in un programma in c++ e ormai non so più dove sbattere la testa.

    la situazione è questa:
    Ho due classi in due file header diversi ed ognuna per essere definita ha bisogno dell'altra. Al momento della compilazione entra in "ciclo" e mi da errore di compilazione.

    Ho provato ad inserire una dichiarazione incompleta di classe "class A;" nel file B e viceversa ma mi segnala comunque errore perchè nel file .cpp uso sia i campi che le funzioni dei rispettivi file e mi segnala che la classe A non è ancora definita ma solo dichiarata (viceversa per B).

    Come posso fare? Per informazione aggiuntiva ci sono altre classi che usano entrambi le classi quindi tale ciclo può effettuardi diverse volte.

    Grazie a tutti quelli che risponderanno,
    ciao


    file A.h
    ------------------------------------
    #include"b.h"

    class A
    {
    ...
    static B* punt;
    }
    ------------------------------------


    file B.h
    ------------------------------------
    #include"a.h"

    class B
    {
    ...
    funzione1(A*...)
    funzione2(A*...)
    }
    ---------------------------------------
    Ultima modifica di ale666; 17-05-2015 a 12:24

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Perché due volte class B { etc } ?
    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
    Registrato dal
    May 2015
    Messaggi
    4
    a
    Ultima modifica di ale666; 17-05-2015 a 12:45

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2015
    Messaggi
    4
    Quote Originariamente inviata da shodan Visualizza il messaggio
    Perché due volte class B { etc } ?
    scusa ma ormai non ci vedo più! l'ho modificato

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    In casi simili non c'è altro modo se non ricorrere alla forward reference e un puntatore. Infatti il compilatore sa com'è fatto un puntatore, ma non com'è definita la classe del puntatore.
    Perché funzioni il tutto è indispensabile che nelle dichiarazioni delle classi (o nell'header file in generale) non si faccia riferimento ai campi (metodi o variabili) della classe incompleta.
    Non serve nemmeno fare un giro strano di include, ma è sufficiente usare la forward reference.
    Gli include necessari dovranno però essere inseriti nei file rispettivi file.cpp prima che metodi o variabili della classe in forward reference siano usati.


    file A.h
    codice:
    class B; // forward reference
    class A {
        static B* punt;
    };
    file B.h
    codice:
    class A; // forward reference
    class B {
        funzione1(A*...);
        funzione2(A*...);
    };
    file A.cpp
    codice:
    #include "A.h"
    #include "B.h"
    // ora il compilatore sa com'è fatta sia A sia B
    // sviluppo funzioni etc.
    B* A::punt = nullptr;
    file B.cpp
    codice:
    #include "B.h"
    #include "A.h"
    // ora il compilatore sa com'è fatta sia A sia B
    // sviluppo funzioni etc.
    B::funzione1(A* arg) {
        arg->metodo_strano();
    }
    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.

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2015
    Messaggi
    4
    Quote Originariamente inviata da shodan Visualizza il messaggio
    In casi simili non c'è altro modo se non ricorrere alla forward reference e un puntatore. Infatti il compilatore sa com'è fatto un puntatore, ma non com'è definita la classe del puntatore.
    Perché funzioni il tutto è indispensabile che nelle dichiarazioni delle classi (o nell'header file in generale) non si faccia riferimento ai campi (metodi o variabili) della classe incompleta.
    Non serve nemmeno fare un giro strano di include, ma è sufficiente usare la forward reference.
    Gli include necessari dovranno però essere inseriti nei file rispettivi file.cpp prima che metodi o variabili della classe in forward reference siano usati.


    file A.h
    codice:
    class B; // forward reference
    class A {
        static B* punt;
    };
    file B.h
    codice:
    class A; // forward reference
    class B {
        funzione1(A*...);
        funzione2(A*...);
    };
    file A.cpp
    codice:
    #include "A.h"
    #include "B.h"
    // ora il compilatore sa com'è fatta sia A sia B
    // sviluppo funzioni etc.
    B* A::punt = nullptr;
    file B.cpp
    codice:
    #include "B.h"
    #include "A.h"
    // ora il compilatore sa com'è fatta sia A sia B
    // sviluppo funzioni etc.
    B::funzione1(A* arg) {
        arg->metodo_strano();
    }

    Grazie mille!! sei il migliore... funziona tutto!

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.