Newsgroup: it.comp.lang.c++
Titolo: Problema riferimenti incrociati: chi mi aiuta?

Ciao a tutti,
ho un problema con i file header, le dichiarazioni e compagnia.
Tento di schematizzarlo: il sistema è composto da una classe base (Base), e
da due classi derivate pubblicamente da questa Der e DerContainer;
DerContainer  è un contenitore di istanze della classe Der.
Tutte e tre le classi sono dichiarate e definite in 3 files separati (...
beh, 6), uno per classe.
Il file header della classe base è banale.
Il file header di Der contiene un #include per includere l'header di
DerContainer (Der deve sapere da chi è contenuta), il file header di
DerContainer contiene in #include per includere l'header di Der (...per
forza!).
Premesso che ho definito simboli appropriati in modo da non dichiarare due
volte le stesse cose (#ifdef... etc), il codice di cui sopra mi dà errori
(giustamente) di cui comprendo la natura, ma di cui non vedo una soluzione.
Grazie da subito a chi vorrà aiutarmi.
Gabriele
PS: Non metto l'indirizzo di posta nel msg perchè l'ultima volta che ho
fatto un post mi sono arrivati a casa un sacco di spam da parte di
fantomatiche sociatà che vendono cissà cosa... rispondetemi sul newsgroup.

 forza!).
Questo invece e' piu' ragionevole.
--
Ivan Molella
__LINUX__ the choice of the __GNU__ generation
icq# 97960484

da due classi derivate pubblicamente da questa Der e DerContainer;
...
Per poter dichiarare un puntatore ad una classe non e' necessario
che sia nota l'intera interfaccia... es:
  /// Der.h
 
  class DerContainer;  // Forward
 
  class Der
  {
    ...
    DerContainer *container;
    ...
  };
  /// DerContainer.h
  class Der; // Forward
  class DerContainer
  {
    ...
  };
  /// Der.cpp
  #include "Der.h"
  #include "DerContainer.h"
  ...
  /// DerContainer.cpp
  #include "Der.h"
  #include "DerContainer.h"
  ...
Cosi' facendo nei file .cpp di implementazioni hai a disposizione
l'interfaccia completa ma non sono presenti definizioni circolari
negli header.
Purtroppo a volte negli header sono necessarie piu' informazioni
(ad esempio se si voglio definire funzioni inline che chiamano
metodi dell'altra classe) e quindi uno dei due file .h deve
includere l'altro; se pero' la necessita' e' presente in uno solo
dei due include non ci sono problemi.
In alcuni casi, quando e' presente uno strong coupling, non mi
vergogno di usare un unico file di include per entrambe le classi
e un unico file di implementazione. In fondo secondo me si aumenta
la chiarezza (visto che ciascuna delle due classi non puo' essere
considerata senza considerare anche l'altra).
HTH
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

Questo invece e' piu' ragionevole.
Spesso serve molto meno dell'intero file .h ... basta dire
"class other;". Ci si salva da problemi di riferimenti
circolari e si migliorano notevolmente i tempi di compilazione.


 contenuto; non nella classe base/derivata.
Continuo a trovare poco elegante l'inclusione dell'header della classe derivata
in quello della classe base.
A questo punto sarebbe meglio mettere tutto in un header file,visto lo stretto
legame tra i tipi in questione.


DerContainer (Der deve sapere da chi è contenuta)
La suddivisione in tanti header (uno per classe) non e`
generalmente la migliore, se due classi sono in cosi` stretta
relazione (l'una deve conoscere l'altra) allora e` pensabile che
stiano nello stesso header. In generale inoltre il contenuto non
dovrebbe sapere chi lo contiene...
La tecnica generale per risolvere questi problemi e` avere un unico
header cosi` fatto:
class DerContainer;
class Der {
   ...
   DerContainer* m_OwnerPtr;	// [1]
// o meglio un ref se puoi inizializzarlo nel ctor
};
class DerContainer {
  ...
 Der m_Member;   // ora la dimensione di Der e` nota
// e puoi utilizzare il contenimento diretto
};
// funzioni inline di Der e DerContainer
[1] Nota che se utilizzi il contenimento indiretto, e` sufficiente una
forward declaration a meno che tu non faccia esplicitamente
riferimento alla struttura della classe (dimensione, metodi, data
member...). Quindi se DerContainer contenesse un puntatore (reference)
a Der potresti mettere delle forward declaration negli header e
rimandare le inclusioni solo nei file .cpp
Paolo