Newsgroup: it.comp.lang.c++
Titolo: Evidentemente non il banale : classe A usa B e classe B usa A

Su questo argomento ho letto molti thread ... ma non mi sono stati d'aiuto
in questo caso particolare.
Spero vivamente di non sbagliarmi sulla singolarità del problema...
In pratica ho una classe A (principale) che vuole delegare delle operazioni
(che protrebbe benissimo farseli per conto proprio) ad un'altra classe B.
Questa classe nel suo costruttore accetta il puntatore alla classe B. Tutto
qui. Purtroppo nella compilazione della classe A (per la B non ci sono
problemi) riscontro il seguente errore :
"error : variable 'B b' has initializer but incomplete type"
questo avviene appena cerco di inizializzare B. Ovviamente se dichiaro
semplicemente un puntatore a B non ho assolutamente problemi...ma non posso
allocare niente :((
Di seguito allego il codice (completo, nei minimi dettagli)
grazie per qualsiasi forma di aiuto.
P.s.
Mi sono letto il documento 
http://www.objectmentor.com/publications/dip.pdf
ma non sono riuscito a trovare alcun riferimento che mi potesse aiutorare
//------- begin ----- class_a.h-----
#ifndef CLASS_A_H
#define CLASS_A_H
class A;
class B
{
  public :
  B(A* ptrA) {  /* vari esami su A */};
};
#endif
//------- end ----- class_a.h-----
//------- begin ----- class_a.cpp -----
#include "class_a.h"
void A::test()
{
  B b(this);
}
//------- end ----- class_a.cpp -----
//------- begin ----- class_b.h-----
#ifndef CLASS_B_H
#define CLASS_B_H
class A;
class B
{
  public :
  B(A* ptrA) {  /* vari esami su A */};
};
#endif
//------- end ----- class_b.h-----
//------- begin ----- class_b.cpp -----
#include "class_b.h"
//------- end ----- class_b.cpp -----

 allocare niente :((
Umh... il tuo codice dovrebbe corrispondere al seguente, tutto in un unico
file:
 class A;
 class B
 {
   public :
   B(A* ptrA) {  /* vari esami su A */};
 };
  void A::test()
  {
   B b(this);
 }
 int main() {
  return 0;
}
L'errore lo da anche con l'istruzione B* b(this) proprio perche' il problema
e' la non dichiarazione di Test in A. Infatti a quel punto B e' definita
quindi l'istruzione B b(this) e' legale.
Ciao

 ha scritto:
Ah, inoltre per creare oggetti B* che puntano ad A, A deve derivare da B. Se
non c'e' relazione gerarchica non puoi.
Ciao

 //------- end ----- class_b.cpp -----
-- 
Horst


hai ragione nel copia incolla devo aver cappelato qualcosa...
cmq il mio problema l'ho risolto mettendo tutto nello stesso file. Più in
qua cercherò di capire come mai in file differenti non funge.
Un'altra nota. L'esempio con A e B invece funziona anche in file separati.
Purtroppo il mio codice è leggermete diverso. Ovvero nonostante il
principio sia quello, di mezzo ci sono anche altre classi derivate (si da A
che da B) che evidenmente mi danno problemi. 
Più qua se no riesco a risolverlo chiederò aiuto!!! ... cmq grazie mille a
tutti per l'aiuto!! 

Mi sa che devo aver sbagliato ad incollare i codici...
non mi spiego come possa aver sbagliato in tale operazione :((
i file class_a.h, class_a.cpp, class_b.h e class_b.cpp sarebbero:
//------- begin ----- class_a.h-----
#ifndef CLASS_A_H
#define CLASS_A_H
class B;
class A
{
	public :
		void test();
};
#endif
//------- end ----- class_a.h-----
//------- begin ----- class_a.cpp -----
#include "class_a.h"
void A::test()
{
	B b();
}
//------- end ----- class_a.cpp -----
//------- begin ----- class_b.h-----
#ifndef CLASS_B_H
#define CLASS_B_H
class A;
class B
{
	public :
		B(A* ptrA) {  /* vari esami su A */};
		B(){};


 //------- end ----- class_b.cpp -----
-- 
Horst