Newsgroup: it.comp.lang.c++
Titolo: dll e template singleton

Ciao a tutti... ho un problemino.
Ho una libreria che ho deciso di mettere tutto in una DLL...
La libreria usa un template per fare i singleton fatto più o meno così:
template <class T>
class DLLIMPORT Singleton {
protected:
   static T *classInstance;
public:
   static T *Instance() {
      static T *classInstance=NULL;
      if (!classInstance) classInstance=new T();
      return classInstance;
   }
};
E poi basta fare una estensione, per fare un esempio:
class Manager:public Singleton<Manager> ......
Prima andava alla perfezione, ora che linko la dll mi succede che chiama 2
volte l'operatore new!! Una volta nel contesto della dll (cioè in un
metodo compilato all'interno, il primo che chiama Instance) e una volta la
prima che chiamo Instance nel programma che linko alla dll...
Cioè, mi sembra di avere capito che il membro statico venga in realtà
linkato due volte, una perchè includo l'header tra i file per compilare la
dll, e una volta perchè compilo il programma che usa la dll ovviamente
includendo ancora l'header...
Mi tocca per forza fare i singleton in modo diverso (certo che la vedo dura
senza poter usare statiche) oppure, che voi sappiate, c'è un qualche trucco?
Ah, se servisse, compilo con MinGW.
Grazie in anticipo!
Ciao!
Matteo

 Ho una libreria che ho deciso di mettere tutto in una DLL...
Ricorda che qui si parla di linguaggio C++ standard, e le DLL invece 
sono specifiche di win32: it.comp.programmare.win32
-- 
Mat/tia Belletti - Undergraduate student @ 
cs.unibo.it
ICQ: 33292311    - email: 
mbel...@cs.unibo.it
IRC: RedGlow     - site(s): 
http://www.cs.unibo.it/~mbellett
Linux registered user 299762 @ Linux registered machine 213003


Scusa ma perchè dichiari due volte "static T *classInstance"?
Così a occhio... mi pare che dentro il costruttore Instance() ti basti
scrivere "classInstance = NULL" altrimenti la new te la fa su una variabile
locale al costruttore e non dell'omonimo attributo della classe.....

 locale al costruttore e non dell'omonimo attributo della classe.....
Mah quello non dà problemi... ho provato a spostare quella riga fuori, non
mi cambia niente.
Il fatto è che le variabili statiche vanno redichiarate perchè vengano
effettivamente istanziate (o almeno mi pare di aver capito che è cosi').
Fatto sta che la classe in sè funziona perfettamente, è il diverso linkaggio
che dà problemi...

 sono specifiche di win32: it.comp.programmare.win32
Domandare è lecito, rispondere è cortesia...

> Domandare è lecito, rispondere è cortesia...
Domandare non è lecito, se non si è letto il manifesto e non si
rispetta il topic.

 che dà problemi...
Ok ... allora toglierei l'attributo ... :o)
template <typename T>
class Singleton
{
public:
     static T* GetInstance() {
         static T *pInstance;
         if (!pInstance)
           pInstance = new T;
         return pInstance;
   }
};
Attenzione all'uso di DLLIMPORT perchè mi pare che implichi l'utilizzo di
altre parole chiave come __declspec per ogni dichiarazione di variabile
(questo non è il ng adatto per questo argomento).
Io l'ho tolta ma forse se dichiari una dll ti potrebbe essere utile
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccelng/htm/msmod_20.asp
.
Inoltre valuta la possibilità di utilizzare gli smart pointers.
Ciao


Una domanda: la classe Manager che utilizzi nell'esempio fa parte della DLL
?
Fabio

...

Mattia ha ragione (vedi l'altra risposta). In ogni caso il tuo
problema e' che devi assicurarti che il tuo singleton venga istanziato
solo nella DLL. Hai qualche speranza di riuscirci solo se tutte le
classi su cui lo istanzi appartengono alla DLL. Devi spostare tutto il
codice fuori dalla classe, fare in modo che la definizione del membro
dato statico non sia vista all'esterno della DLL e istanziare
esplicitamente tutte le specializzazioni che ti servono.
Ciao,
Nicola

Vi ringrazio dei suggerimenti! Proverò a fare qualcosa ed eventualmente
seguirò qualche strada alternativa.
Mi scuso inoltre se il mio post è sembrato fuori posto, ma pensavo che
sarebbe stato più facile avere una risposta in questo ng rispetto all'altro,
supponendo che si trattasse di una domanda che riguardava più l'aspetto di
come il compilatore c++ tratta variabili statiche e template piuttosto che
un problema di piattaforma.
Ciao
Matteo