2009-11-21 3 views
0

Je veux avoir une classe singleton que son objet n'est pas créé statiquement. ayant le code suivant, quand je l'appelle ChromosomePool :: createPool() je reçois le message d'erreur suivant:créer une classe singleton qui a un constructeur qui accepte les arguments qui sont évalués runtime

-> ChromosomePool.h: 50: undefined reference to `Myga :: ChromosomePool :: piscine » < - -

Quelqu'un peut-il s'il vous plaît me dire comment puis-je résoudre le problème?

class ChromosomePool { 

private: 
    double * array; 
    const int len; 
    const int poolSize; 
    const int chromosomeLength; 

    static ChromosomePool* pool; 

    ChromosomePool(int size_of_pool, int length_of_chromosom): 
    poolSize(size_of_pool) , chromosomeLength(length_of_chromosom), 
    len(size_of_pool*length_of_chromosom){ 
     array = new double[len]; 
    } 

public: 

    static void createPool(int size_of_pool, int length_of_chromosom) { 
     if(pool) { 
      DUMP("pool has already been initialized."); 
      exit(5); 
     } 

     pool = new ChromosomePool(size_of_pool,length_of_chromosom); 
    } 

    static void disposePool() { 
     if(!pool) { 
      DUMP("Nothing to dispose"); 
      exit(5); 
     } 

     pool ->~ChromosomePool(); 
     pool = NULL; 
    } 

    static ChromosomePool* instace() { 
     if(!pool) { 
      DUMP("Using pool before it is initialized"); 
      exit(5); 
     } 
     return pool; 
    } 


    ~ChromosomePool() { 
     delete[] array; 
    } 

}; 

Répondre

3

membres statiques doivent être définis, vous ne déclarez pool comme existant quelque part.

Mettre cela dans le fichier source correspondant:

ChromosomePool* ChromosomePool::pool = 0; 

Here est l'entrée dans C++ FAQ Lite pour le sujet.

+0

Ensuite, il aurait eu une erreur de lien, mais cela semble être un problème de compilation – Elemental

+1

'undefined reference' est une erreur de lien. –

1

J'ai exécuté votre code via VS2008 et j'ai obtenu 'non résolu externe ...' de l'éditeur de liens parce que le pool de membres statiques n'a pas été instancié comme le dit gf dans sa réponse. Y compris:

ChromosomePool* ChromosomePool::pool(0); 

résout ceci comme dit gf.

Vous devez également noter que:

pool ->~ChromosomePool(); 
pool = NULL; 

ne fait pas ce que vous voulez faire, car il ne désallouer pas la mémoire réservée à la piscine; spécifiquement:

delete pool; 
pool=0; 

supprime la mémoire allouée (et appelle implicitement le destructeur qui est le point du destructeur). Dans mon expérience, il y a très peu de situations où un appel destructeur explicite est nécessaire

+0

'external non résolu' dans VC est le même que' non défini reference' dans gcc. –

Questions connexes