Newsgroup: it.comp.lang.c++
Titolo: regole di visibilità con gli header file

Pongo a voi queste domande per fare luce negli oscuri meandri della mia
mente, perchè sembra proprio che io non riesca a comprendere appieno queste
semplici regole.
1) Avendo un header per ogni classe e un altro header per tutti i metodi
relativi a detta classe, mi ritrovo con circa una 20na di header, che devono
purtroppo rimanere così divisi (almeno per adesso è necessario, in seguito
sarà possibile fare un solo header per tutte le classi e uno per tutti i
metodi): vorrei sapere se la normale dichiarazione di classe è sufficiente a
renderla visibile negli altri file usando la direttiva #include; stesso
discorso per i metodi relativi ad ogni classe.
2) Siccome ogni header relativo alle classi e ai metodi deve includere due
header chiamati const.h e types.h, non ci saranno problami di definizione
multipla (spero che il termine sia giusto...)? Come posso ovviare al
problema, se davvero esiste questo problema?
vi ringrazio per l'attenzione e per il tempo perso ad aiutarmi :-)
Bruno Di Nardo

 problema, se davvero esiste questo problema?
Il problema puo` esserci (una typedef ripetuta, ad esempio, e` un errore)
e si aggira portabilmente nel modo classico: "rivestendo" ogni header
file pippo.h, con, all'inizio:
#ifndef _PIPPO_H
#define _PIPPO_H
e, alla fine,  un #endif.  Questo garantisce l'idempotenza di una eventuale
molteplice inclusione.
Alex

 ad essa relativi...?  Scusa, ma non e` affattoo chiaro.
Che in un file ho la definizione della classe, in un altro tutto il codice
per i metodi della relativa classe. Ho comunque ovviato mettendo tutto
quello che riguarda una singola classe in un solo file, credo sia meglio.
Grazie per la dritta sul #ifndef :-))
Bruno

 problema, se davvero esiste questo problema?
Con la consueta tecnica:
#ifndef NOME_HEADER
#define NOME_HEADER
// dichiarazioni
#endif
EMG

 #define _PIPPO_H
L'underscore iniziale č riservato al sistema.
EMG

 Grazie per la dritta sul #ifndef :-))
Prego.  Comunque il codice, se non inline, sta in un file sorgente
(tipicamente .cpp), che non va usato con #include ma con compilazione
separata e poi link, NON in un .h che va appunto usato con #include.
Alex

 Grazie per la dritta sul #ifndef :-))
Allora avrai scritto *l'implementazione* della classe, e questo non va nel
file header: l'implementazione è sempre meglio metterla in un file separato,
compilato separatamente e linkato al resto alla fine, tranne che in rari
casi con i template, risolvibili comunque sempre comunque con particolari
comandi del preprocessore, se non erro...

 Alex
Il mio problema è che sto facendo un programma in gruppo con altri ragazzi,
come progetto d'esame di Sistemi Operativi. Però dobbiamo separarci i
compiti e quindi scrivere le varie librerie un po' per uno. Come facciamo a
usare classi e metodi senza metterli in un file .cpp? il sorgente col main
ci verrà fornito in seguito, ora noi dobbiamo solo occuparci di fare le
librerie richieste...
Bruno

librerie richieste...
Stabilite queli classi realizzare, metti le definizioni delle classi in
uno o piu` file header (es. myclass.h) , mentre le definizioni le metti 
nel file myclass.cpp che deve include l'header. Eventuali altri file che
devono utilizzare le classi devono solo includere il file header.
Ovviamente in fase di compilazione devi compilare anche myclass.cpp
e linkarlo ai moduli che usano le tue classi.
Per maggiori dettagli sull'uso degli header ti rimando ad un qualunque 
libro sul C/C++ (o se vuoi al mio tutorial su 
www.programmazione.it
).
Paolo
--------------------------------------------------
  Paolo Marotta
  Computer Science, University of Pisa
  home:   
http://www.cli.di.unipi.it/~marotta
--------------------------------------------------

 comandi del preprocessore, se non erro...
...ma
forse erri nel senso che è comune avere compilatori che non supportano l'uso
di extern con i template e dunque si deve lasciare l'implementazione assieme
all'interfaccia.
Come fai a risolvere questo problema con comandi del preprocessore ?
---
Livio Cavallo