Newsgroup: it.comp.lang.c++
Titolo: inclusione di vari file interdipendenti

salve a tutto il NG
scusate la domanda molto niubba, ma non sono riuscito a fugare i miei
dubbi in nessun modo: purtroppo riprendo in mano il c/c++ dopo anni da
informatica 1...
per un mio prog ho creato varie classi reciprocamente dipendenti,
ovvero una classe matrice, una vettore, una geometria e altre ancora.
Adesso per fare ordine vorrei separarle e archiviarle in file separati
nel seguente: matrice.h, matrice.cpp, vettore.h, vettore.cpp, etc.
Il problema e che le classi si richiamano reciprocamente, nel senso
che alcuni output di matrice sono vettori, mentre alcuni suoi input
sono mesh, implementate in geometria. Inoltre anche nel main dichiaro
e utilizzo tutte le strutture sia direttamente che indirettamente.
qual'e' il modo giusto di procedere? io incappo solo in inclusioni
degeneri e/o ridondanti...
grazie e scusate la mia domanda veramente terra-terra....
Sukutestriz
::SuperRobotMuseum::
http://digilander.libero.it/SuperRobotMuseum/SRM.html

 grazie e scusate la mia domanda veramente terra-terra....
Beh... per intanto potresti usare il "trucco" dell #ifndef
// inizio Vettori.h
#ifndef VETTORI_HEADER
#define VETTORI_HEADER
#include "matrice.h"
....
...
...
#endif
// fine Vettori.h
Lo stesso per Matrice.h (in matrice includi vettori.h)
Poi, se tutto quello che ti serve sono puntatori a Vettori o Matrici, allora
puoi anche dire al compilatore "guarda che prima o poi definirň questa
classe". In questo caso la classe la puoi usare solo per ottenere puntatori
di quel tipo. Fai cosě
class nomeclasse;
poi la definisci come vuoi senza problemi.
--- bye


allora, in realta'  la mia classe si chiama current e non vector,
quindi devo scrivere cosi?
#ifndef CURRENT_HEADER
#define CURRENT_HEADER
e dove inserirlo dovunque avrei messo il semplice include, correggimi
se sbaglio; anche nel main immagino.
siccome sia nelle dichiarazioni che nell'implementazione di Matrix c'e
un richiamo a current, devo metterlo in testa a entarmbe? E siccome
devo includere anche geometry, faccio tutto nello stesso ifndef?
Grazie e scusami se approfitto, ma sono un pochino incartato....
-- 
Sukutestriz
::SuperRobotMuseum::
http://digilander.libero.it/SuperRobotMuseum/SRM.html

Nooo... Rileggiti i commenti che ho messo nel messaggio. Tu inizi ogni
header con un:
#ifndef NOMEHEADER_HEADER  (o qualunque nome di fantasia ti vada... Basta
che sia UNICO)
#define NOMEHEADER_HEADER
e li termini con
#endif
fra l'ifdef e l'endif (ma dopo il define che dev'essere subito dopo l'ifdef)
ci piazzi un include per ogni header che viene usato nel primo header.
Grazie all'ifdef non ti devi preoccupare di avere header circolari.
--- bye

 wrote:
[CUT]
ciao, e grazie di tutto, credo di aver capito, in pratica si dice al
compilatore di skippare cio che c'e tra il #ifndef e #iendif se si
ripresenta piu' di una volta l'etichetta specificata, vero?
io avevo inizialmente capito invece che la procedura  servisse a
specificare un header definito "altrove" in modo da identificarlo una
volta per tutto e quindi evitare di ri-linkarlo ogni volta... 
adesso vado a tentare di convertire il mio incasinatissimo progetto...


 ripresenta piu' di una volta l'etichetta specificata, vero?
Hmmm... Non so se sia esatto quello che tu dici. Non l'ho capito. Cmq ti
posso dare un esempio:
#include "mioinclude.h"
#include "mioinclude.h"
Il secondo #include non farà praticamente niente, perchè verrà "stoppato"
dall'#ifdef
--- bye

 wrote:
ciao scusa, probabilemente hai ragione, non ho capito esattamente...
per prova ho creato una classe babbo e una classe mamma fatte cosi:
// inizio babbo.h
#ifndef BABBO_HEADER 
#define BABBO_HEADER
#include <string>
#include "mamma.h"
using namespace std;
class babbo
{   string name;
    int age;
public:
babbo(string nome, int eta){name=nome; age=eta;}
string getname();
int getage();
mamma getmoglie();
};
#endif 
// fine babbo.h
// inizio babbo.cpp
#include <string>
using namespace std;
#include "babbo.h"
#include "mamma.h"
string babbo::getname() {return name;}
int babbo::getage() {return age;}
mamma babbo::getmoglie() 
	{string mammaname =name.substr(0,name.length()-1)+"a"; return
mamma(mammaname, age-5);}
// fine babbo.cpp
mamma.h e mamma.cpp sono speculari, con gemarito anziche getmoglie.
Nel main le includo e le uso, ma il compilatore (VC++ 5) risponde
cosi':
babbo.cpp
D:\MyCpp\temp2\prova\mamma.h(16) : error C2501: 'babbo' : missing
decl-specifiers
D:\MyCpp\temp2\prova\mamma.h(16) : error C2146: syntax error : missing
';' before identifier 'getmarito'
main.cpp
D:\MyCpp\temp2\prova\mamma.h(16) : error C2501: 'babbo' : missing
decl-specifiers
D:\MyCpp\temp2\prova\mamma.h(16) : error C2146: syntax error : missing
';' before identifier 'getmarito'
mamma.cpp
D:\MyCpp\temp2\prova\babbo.h(16) : error C2501: 'mamma' : missing
decl-specifiers
D:\MyCpp\temp2\prova\babbo.h(16) : error C2146: syntax error : missing
';' before identifier 'getmoglie'
prova.exe - 6 error(s), 0 warning(s)
ma perche dice cosi'? io in mamma ho incluso babbo prima di usare una
funzione che lo utilizzi...
ciao e scusami per l'insistenza, ma e' molto importante per me...


     int age;
E chiaramente metti un class babbo; nel file corrispondente.
--- bye


wrote:
grazie, infatti adesso funge!
ora il problema sara' smembrare il mio attuale progetto e ricostruirlo
in questo modo!
comunque sara' bene che mi cerchi materiale che spieghi il
preprocessore, dato che sono molto carente...
