Newsgroup: it.comp.lang.c++
Titolo: Problema con le classi

Sto lavorando ad un programma e per semplicità l'ho diviso in vari .cpp e
.h.
Ho 3 file.h in cui do i prototipi di 3 diverse classi 3.cpp in cui definisco
le 3 classi.
Il problema è che 2 delle 3 classi devono accedere alla terza, allora ho
creato un global.h così scritto:
#include "rout.h"
rout tab
In questo modo l'oggetto tab dovrebbe essere globale.
Se includo global.h in solo 1.cpp funziona, ma se lo includo anche nel
secondo.cpp ottengo un errore
di link che mi dice che tab è già stato definto.
Allora ho provato ad includere global.h in un .cpp e nell'altro inserire:
extern tab
ma quando uso il comando tab.prima_colonna;
mi dice che tab deve essere una classe/unione/tipo.
Come posso risolvere il mio problema, cioè come faccio a rendere visibile un
oggetto a due oggetti diversi definiti in due diversi file?
Grazie a chi mi volesse aiutare.

Regole generali:
1) Usare se non se ne puo proprio fare a meno un .h per ogni classe (e
relativo .cpp )
2) Usare le guardie:
    Il .h deve essere in questa forma:
    //
    #ifndef  ___NOMEDELLACLASSE___
    #define  ___NOMEDELLACLASSE___
    class XXXXXXXXXXX
    {
        ............
    };
    #endif
3) Usare gli include solo dove servono, senza fare dei global.h che
includono tutti gli altri  .h
4) Non mettere include inutili che non servono.
5) Usare le forward declaration:
    //file pippo.h
    #ifndef ____PIPPO_____
    #define ____PIPPO_____
    class Pluto;        //forward declaration
    class Pippo {
        .............
        foo(const Pluto& aPluto);
    };
    #endif
    non c'e' bisogno di includere nel pippo.h il file pluto.h e' sufficiente
la forward decl, infatti
    il compilatore quando dichiari foo non ha bisogno di sapere come e'
fatta esattamente la
    classe Pluto (l'argomento di foo e' un reference, sarebbe lo stesso se
era un puntatore),
    ovviamente l'include va fatto dopo nel .cpp
Da quello che dici ho l'impressione che non hai messo le guardie (vedi punto
2).
-- 
Posted from [194.214.173.28] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 2).
non credo che sia questo il problema di "apollion" (visto che non hai
quotato il suo
messaggio mi chiedo se almeno lo hai letto ;-)
Nel messaggio originale, si fa riferimento ad una variabile globale
definita in un
header file (global.h) ed inclusa da vari files .cpp
Succede che ogni file oggetto ottenuto compilando i .cpp si ritrova con
un'instanza
di questa variabile ed il linker protesta (giustamente) perche' la trova
definita
in tutti gli oggetti che sta provando a collegare.
Il modo piu' semplice per risolvere questo problema di linking consiste
nel
definire come extern la variabile in global.h e ridefinirla non extern
in uno solo
dei .cpp.
Un modo piu' elegante potrebbe essere quello di rendere la classe in
questione un
singleton. 
Le variabili globali non sono generalmente molto apprezzate nella
programmazione C++ "moderna" e i singleton consentono di evitarle.
(anche se, spesso, l'abuso di singleton e' spesso un sintomo di
"cattivo" design)
Salut,
Fabio


     #define  ___NOMEDELLACLASSE___
Quasi corretto.  Lo scopo e' nobile e giusto.  Ma purtroppo (ISO-IEC
18882:1998 17.4.3.1.2): gli identificatori che contengono due
underscores o che iniziano per underscore seguito da una maiuscola
sono riservati all'implementazione; quelli che non ricadono nella
categoria precedente e che cominciano per underscore sono riservato
all'implementazione nel global namespace (ad esempio e' legale
scrivere struct foo { private: int _foo; ... }; ).
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Univ. of Padova, Dept. of Physics - Padova, Italy            
lor...@pd.infn.it

Cos'è un singleton?
--
Stefano Pettini
Notary of 
www.thawte.com

 
 
http://www.cs.usyd.edu.au/~cs3/oos/creational-patterns.html
 
http://www.csis.gvsu.edu/~erickson/CS621/Notes/Patterns/11_Singleton.html

Max M. wrote:

in italiano trovi anche qualcosina su 
cpp.programmazione.it
, sezione 
Tips&Tricks
ciao Anto
-- 
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.6, higher than 98% of all previous test takers.
C Language: 3.32, higher than 79% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it