Newsgroup: it.comp.lang.c++
Titolo: Help: Classi derivate e mutui riferimenti...

Ciao a tutti,
ho un problema: non riesco a definire in c++ due classi derivate della
stessa classe base che facciano mutuamente riferimento l'una all'altra
esempio:
class Base_cl
{
public:
 void f(); 
...
};
class Derivata1: public Base_cl; 
/*
  Mi serve una dichiarazione forward per poter usare il nome di questa
classe nella definizione della classe Derivata2, ma se dichiaro la classe
in questa maniera il compilatore (g++) mi da' l'errore: "base clause
without member specification for class 'Derivata1'" (cosa vuol dire?) e se
dichiaro la classe senza specificare la classe base ho un errore durante
la compilazione della classe Derivata2 quando cerco di usare un membro di
tipo Derivata1 (o Derivata1 *) come membro della classe base.
*/
class Derivata2: public Base_cl
{
private:
 Derivata1 * d1;
public:
 void h()
 {
  d1->g() /* Funzione che non e' presente nella classe base */
  d1->f() /* Funzione della classe base */
 }
 ...
};
class Derivata1: public Base_cl
{
public:
 void g();
 ...
}
Come posso definire correttamente le classi Derivata1 e Derivata2?
E' possibile che ci possano essere due classi che fanno riferimento l'una
all'altra ma non due classi derivate dalla stessa classe base che fanno
riferimento l'una all'altra?
Vi ringrazio tutti per l'attenzione. Se possibile, rispondetemi anche in
forma privata, cosi' e' piu' sicuro che ritrovo la risposta.
Vincenzo Ciancia

Per la forward declaration di class Derivata1 e' sufficente scrivere:
class Derivata1;
prima di usare il puntatore all'interno di Derivata2.
Se pero' all'intero di Derivata2 definisci anche la funzione membro inline h
che fa' un rifeimento esplicito a una funzione membro di Derivata1 allora
devi far precedere la dichiarazione completa di Derivata1 prima di
Derivata2.
class Base_cl
{
public:
void f();
};
class Derivata1: public Base_cl
{
 public:
 void g();
};
class Derivata2: public Base_cl
{
private:
Derivata1 * d1;
public:
void h()
{
  d1->g(); /* Funzione che non e' presente nella classe base */
  d1->f(); /* Funzione della classe base */
}
};
Oppure sposti le definizioni della funzione inline Derivata2::h() fuori
della classe:
class Base_cl
{
 public:
  void f();
};
class Derivata1;
class Derivata2: public Base_cl
{
 private:
  Derivata1 * d1;
 public:
 void h();
};
class Derivata1: public Base_cl
{
 public:
 void g();
};
inline void Derivata2::h()
{
  d1->g(); /* Funzione che non e' presente nella classe base */
  d1->f(); /* Funzione della classe base */
}
Saluti

dovresti fare piu` o meno cosi`:
class Base {
  ...
};
class Derived2;      // solo se ti serve un Derived2* (o reference)
                                    //  in derived1
class Derived1: public Base {
  ...                        // solo dichiarazioni
};
class Derived2: public Base {
  ...    // solo dichiarazioni
};
/* implementazione dei metodi di derived1 e 2 
    eventualmente inline */
Se usi funzioni inline esse non possono essere tra loro mutuamente
ricorsive (non sarebbe risolubile) per via del significato di inline.
Negli altri casi la ricorsione e la mutua dipendenza non dovrebbe
piu` creare problemi.
Paolo
-----------------------------------------------------------------
  Paolo Marotta
  Computer Science, University of Pisa
  home:   
http://www.cli.di.unipi.it/~marotta
-----------------------------------------------------------------