Newsgroup: it.comp.lang.c++
Titolo: Classi non definite e inclusioni circolari.

Ho un problema con le definizioni/dichiarazioni di classi.
Uno schemetto (non UML compilant :) ) della situazione č:
PostureReconstructor
|
usa
|
|--> PowellOpt (eredita da Optimizer) ----usa--> OptSolveFunction
|--> ConjugateGradientOpt (da Optimizer) --usa--> OptSolveFunction
In OptSolveFunction c'e' un puntatore a Classe Optimizer che contiene, 
diciamo, il padre.
Questo puntatore mi serve per far riferimento ad un puntatore (a 
PostureReconstructor) presente nella classe Optimizer che richiama una 
funzione.
Quindi in OptSolveFunction ho:
double operator() ( const TXSTD::vector<double> &x ) const throw 
(TxBadEvalExcept)
{ return mainOptimizer->getPostureObject()->calculateDistance ( x ); };
Pensavo che mi bastasse aggiungere la dichiarazione:
class PostureReconstructor;
all'inizio per far capire che PostureReconstructor č definito da qualche 
parte invece il compilatore continua a dirmi dice che 
PostureReconstructor non č definito.
Ho provato a mettere un #include <PostureReconstructor.h> in 
OptSolveFunction ma il problema si trasforma (nei file PowellOpt e 
ConjugateGradientOpt) in OptSolveFunction non definito, penso per 
un'inclusione circolare che trova non ancora definito OptSolveFunction;
Come potrei uscirne, secondo voi?
matteo!

 Come potrei uscirne, secondo voi?
usi la dichiarazione della classe PostureReconstructor nel file .h di 
OptSolveFunction, sposti l'implementazione dell'operatore () in un file 
OptSolveFunction .cpp e nel file OptSolveFunction .cpp includi la 
definizione della classe PostureReconstructor.
-- 
So dark the con of man

 definizione della classe PostureReconstructor.
Grazie, funziona! :)
matteo!
(alias analisifunzionale)

 Grazie, funziona! :)
Come non dettto :(
Funziona tutto in fase di compilazione ma poi mi da un errore il linker.
In particolare:
ConjugateGradientOpt.obj : error LNK2001: simbolo esterno "public: 
__thiscall OptSolveFunction<double,class std::vector<double,class 
std::allocator<double> > >::OptSolveFunction<double,class 
std::vector<double,class std::allocator<double> > >(class Optimizer *)" 
(??0?$OptSolveFunction@NV?$vector@NV?$allocator@N@std@@@std@@@@QAE@PAVOptimizer@@@Z) 
non risolto
PowellOpt.obj : error LNK2001: simbolo esterno "public: __thiscall 
OptSolveFunction<double,class std::vector<double,class 
std::allocator<double> > >::OptSolveFunction<double,class 
std::vector<double,class std::allocator<double> > >(class Optimizer *)" 
(??0?$OptSolveFunction@NV?$vector@NV?$allocator@N@std@@@std@@@@QAE@PAVOptimizer@@@Z) 
non risolto
Traducendo in un linguaggio uomo-compatibile mi _sembra_ di capire che 
non trova il codice del costruttore che io ho definito nel file 
OptSolveFunction.cpp così:
//--------------------------
template <class RetType, class ArgVecType>
OptSolveFunction<RetType,ArgVecType>::OptSolveFunction ( Optimizer * opt )
: TxVecFuncIfc<RetType,ArgVecType>()
, mainOptimizer (opt)
{
	// Nothing to do
}
//---------------------------
e nel file header cosi':
//-------------------
template <class RetType, class ArgVecType>
class OptSolveFunction: public virtual TxVecFuncIfc< RetType, ArgVecType >
{
public:
	OptSolveFunction ( Optimizer * opt );
	size_t getArgDim( void ) const;
	size_t getRetDim( void ) const;
	double operator() ( const TXSTD::vector<double> &x ) const throw 
(TxBadEvalExcept);
	inline void setOptimizer ( Optimizer *opt );
private:
	Optimizer * mainOptimizer;
};
//-------------------
Faccio qualche errore usando i template, secondo voi?
Per me i template rimangono un aspetto ostico del c++ :(
matteo!
(alias analisifunzionale)

 //-------------------
ah, ma allora la storia non l'hai raccontata bene! Se la classe č un 
template, non credo tu possa dare la dichiarazione in un file .h e fare 
la definizione in un file .cpp come faresti per una classe non-template.
Sinceramente, in questo caso, non saprei veramente che consiglio darti, 
se non quello di introdurre un ulteriore livello di indirezione e 
trasformare Optimizer in un'interfaccia. Magari perň, qualcuno del NG ha 
qualche idea migliore che a me in questo momento sfugge completamente.
-- 
"Come un nano sull'orlo di un orinale dovevo muovermi in punta dei piedi"

 Per me i template rimangono un aspetto ostico del c++ :(
Prova a guardare il post
errori = friends + templates;
di qualche giorno fą, potrebbe esserti di aiuto

 di qualche giorno fą, potrebbe esserti di aiuto
Corro!
matteo!
(analisifunzionale)

 qualche idea migliore che a me in questo momento sfugge completamente.
Non venendone a capo oggi ho eliminato la classe OptSolveFunction e l'ho 
inglobata in PostureReconstructor. Adesso (senza OptSolveFunction di 
mezzo) riesco a compilare.
Rimane la curiosità di capire la questione...
matteo!
(analisifunzionale)