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

    [c++] Ricavare valori da oggetto "padre", problema namespace

    Salve a tutti, ho un problema...

    Ho una classe chiamata Trave che al suo interno è costituita da oggetti quale il Materiale e alcune proprietà ad esempio un double RH..

    Io dovrei attraverso una funzione di Materiale risalire al valore RH appartenente a Trave e usarlo per alcuni calcoli..

    Ho cercato di fare in questo modo ma non ne sono uscito vivo:

    file trave.h
    codice:
    #ifndef trave_h
    #define trave_h
    
    #include "materiale.h"
    
    class Trave {
       public:
       double RH;
       Materiale m;
    
       ...
    };
    #endif
    file materiale.h:
    codice:
    #ifndef materiale_h
    #define materiale_h
    
    #include "trave.h"
    
    namespace CA {
       class Materiale {
           ....
           double f(double par1, double par2, Trave &t) {
               return par1*par2*t.RH;
           }
        };
    }
    #endif
    Allora, inizialmente non riuscivo a compilare perchè c'era una ricorsione di file, in pratica il file trave.h mi richiama materiale.h che richiama trave.h.
    Questo spero di averlo risolto con i comandi #ifndef #define #endif
    A questo punto però ho il problema che quando vado a compilare il compilatore mi restituisce questo errore:
    Materiale has not been declared
    Ho provato a mettere CA::Materiale con lo stesso risultato...
    Idee?

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Se il tipo Trave compare solo nel costruttore della classe Materiale, devi spostare la sua implementazione dal corpo della classe in un file Cpp separato, che includerà entrambi i file header. Fatto questo, puoi semplicemente effettuare una forward declaration del tipo Trave nel file Materiale.h.
    codice:
    // File Trave.h
    #ifndef trave_h
    #define trave_h
    
    #include "materiale.h"
    
    class Trave {
       public:
       double RH;
       Materiale m;
    
       ...
    };
    #endif
    
    // File Materiale.h 
    
    #ifndef materiale_h
    #define materiale_h
    
    class Trave;
    namespace CA {
       class Materiale {
           ....
           double f(double par1, double par2, Trave &t);
        };
    }
    #endif
    
    // File Materiale.cpp
    #include trave.h
    #include materiale.h
    double CA::Materiale::f(double par1, double par2, Trave &t) {
       // implementazione.
    }
    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
    Per quale motivo materiale deve potere accedere a trave? Sei sicuro che sia corretto il design generale? In ogni modo penso che il problema sia nel NAMESPACE diverso tra le due classi.

  4. #4
    Originariamente inviato da Andrea Simonassi
    Per quale motivo materiale deve potere accedere a trave? Sei sicuro che sia corretto il design generale? In ogni modo penso che il problema sia nel NAMESPACE diverso tra le due classi.
    a proposito di design..
    Ho una proprietà di Materiale che varia in base ad alcune proprietà di Trave e altre proprietà di alcuni oggetti che stanno sempre dentro a Trave (ad esempio le dimensioni della Sezione)
    (purtroppo il calcestruzzo è pieno di difetti )
    Al momento, (non l'ho ancora fatto) ma sarò costretto a fare qualcosa tipo:
    codice:
    trave.materiale.f(par1,par2,trave);
    che non è il massimo..
    non c'è un modo più corretto di fare questo?

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.