Newsgroup: it.comp.lang.c++
Titolo: Problema veramente difficile da risolvere. Un premio a chi lo fà!

Sto sviluppando del codice in c++ utilizzando l'oop. Sono rimasto bloccato
in questa situazione: io definisco due classi Pippo e Pluto che sono
relazionate tra loro come un database relazionale. Cioè: supponiamo che
Pippo sia in relazione 1 a m con Pluto, quindi l'oggetto Pippo dovrà
contenere al suo interno un insieme di puntatori ad oggetti di tipo Pluto,
mentre a sua volta un oggetto di tipo Pluto conterrà un singolo puntatore
ad un oggetto di tipo Pippo. Per implementare questo set mi sono costruito
un oggetto di tipo set template in modo che io instanzio un set con la
dichiarazione: set <tipo_oggetto> nome_set. Quindi nel mio caso dentro la
classe Pippo avrò la seguente istruzione:
 set <Pluto> PlutoSet; 
mentre in Pluto avrò la seguente istruzione :  
Pippo * PippoPtr;
A questo punto quando compilo il compilatore MS-VC++ 5.0 non mi dà
problemi, però quando cerco di creare l'eseguibile mi caccia un errore di
linkaggio. In effetti ho capito a quale errore si definisce, ed è un errore
paragonabile ad un cane che si morde la coda. Infatti se io definisco prima
la classe Pluto e poi Pippo in compilazione non avrò problemi con Pippo ma
con Pluto poichè quando lui nella classe incontra l'istruzione - Pippo *
PippoPtr; - mi dice che Pippo è una classe non definita e viceversa la
stessa cosa accade se inverto le dichiarazioni di classi. A questo punto io
ho capito quale è il problema, però non riesco a capire come risolverlo
poichè per me è necessario avere quei puntatori negli oggetti.
Se qualcuno può aiutarmi gliene sarei molto grato e gli offrirò da bere.
Promesso!!!
P.S.: Spero di essere stato abbastanza comprensibile nella mia esposizione.

 stessa cosa accade se inverto le dichiarazioni di classi.
Il contesto non mi e' molto chiaro, ma non basta una forward declaration?
class Pippo;    // forward declaration
class Pluto {
  private:
    std::set<Pippo> PippoSet_ ;
    // ...
};
class Pippo {
  private:
    Pluto * PlutoPtr_ ;
    // ...
};
-- 
Maurizio Loreti                      
http://wwwcdf.pd.infn.it/~loreti/mlo.html
Un. of Padova, Dept. of Physics - Padova, Italy          
lor...@padova.infn.it

 
In effetti hai ragione. Cosi facendo funziona, solo che ci sono delle cose
che non ho detto precedentemente.
Allora: premetto che io non utilizzo il tipo set fornito dal c++, ma mi
sono costruito io un template per il set. Questi due file che ho creato
set.h e set.cpp li ho già provati con un piccolo programmino di prova e
funzionano correttamente. A questo punto, torno al file header del mio
programma principale che ha tra gli include anche - include "set.h" -, gli
inserisco la forward declaration e nella classe Pluto e precisamente nella
sezione private, metto il comando set <Pippo> PippoSet; e così via. Quando
compilo non ho problemi, ma quando gli dico di creare l'exe mi dice che ha
trovato 5 errori e per la precisione dice:
error LNK20001 : unresolved external symbol "public: ecc. ..."  (lo stesso
messaggio per 5 volte con finali diversi)
fatal error LNK1120: 5 unresolved externals
Ora, quello a cui si riferisce con "pubblic: ecc." sono tutte le funzioni
che ho definito nella parte pubblica della classe Set che ho fatto. Io però
so che tali funzioni sono corrette e funzionano. A questo punto il mio
dilemma è ... che cosa cavolo mi vuole dire sto benedetto compilatore????
Dove ho combinato qualche casino?
Spero di essere stato ulteriormente più chiaro. Ti ringrazio per la
risposta, per l'interessamento e rimango in attesa di ulteriori tue notizie
in merito al mio problema.
Se vuoi posso mettere sul newsgroup il codice del template di tipo set,
tanto è poca roba.
Ciao.

Le funzioni (template) membro del template set che hai fatto devono stare nel .h altrimenti il compilatore non le puo' instanziare (e compilare) e di conseguenza il linker non le trova.
Ciao

RAGAZZI!!!! EVVIVA!!!! 
HO RISOLTO TUTTO!!!
ERA TUTTO DOVUTO DAL FATTO CHE AVEVO MESSO IL CORPO DELLE FUNZIONI MEMBRO
DEL TEMPLATE ALL'ESTERNO.
UNA VOLTA MESSO TUTTO IN UN UNICO FILE E' GIRATO TUTTO CHE E' UNA
MERAVIGLIA.
VI RINGRAZIO TUTTI PER I VOSTRI CONSIGLI !!
SE PER CASO QUALCUNO DI VOI VIENE A ROMA GLI OFFRO DA BERE! PROMESSO!


ICQ #34602650

 sono costruito io un template per il set.
Ma perche' riinventare a tutti i costi l'acqua calda?
Usa la STL --- e scommetto che i tuoi occhi stanchi ed arrossati
torneranno come per incanto a risplendere ...
