2010-09-08 15 views
0

VERSION 1insérer « ce » dans une carte STL du constructeur

 
class Doh { 
private: 
    static std::map<const std::string, const Doh*> someMap; 
    std::string stringValue_; 
public: 
    Doh(std::string str) : stringValue_(str) { 
     Doh::someMap.insert(
      std::make_pair<const std::string,const Doh*> 
       (this->stringValue_,this) 
     ); 
    } 
} 

ci-dessus était ok avec MSVC 2010 mais avec MSVC 2008, il échoue - et je suppose que c'est parce que l'objet ne se construit pas encore quand il est inséré dans la carte (j'ai une violation d'accès mémoire).

Alors, j'ai essayé une insertion retardée, qui a travaillé:

VERSION 2

 
Doh(std::string str) : stringValue_(str) { 
    boost::thread(&Doh::insertIntoTheStaticMap,this); 
} 
void insertIntoTheStaticMap() { 
    boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); 
    Doh::someMap.insert(
     std::make_pair<const std::string,const Doh*> 
      (this->stringValue_,this) 
    ); 
}
Mais comme vous pourriez être en mesure de deviner, mon intention est d'avoir le Doh statique :: someMap comme commune dictionnaire de recherche.

La VERSION 1 n'avait pas besoin de thread-safety parce que je créerais toutes les instances Doh dans le même thread - dans les blocs d'initialisation - qui seraient appelés par les initialiseurs dynamiques avant d'entrer main().

Mais avec la version 2, le sommeil naïf() est ni gracieuse ni fiable (sans parler, je pourrais avoir besoin de verrouiller la carte avant l'insertion).

Quelle serait une belle approche KISS?

+0

Peut-être que vous pouvez afficher plus de code pour la version un. Il ne devrait pas y avoir de problème avec ça. Quel est le type de la carte? Quel est le type de 'this-> stringValue_'? Comment utilisez-vous la carte? –

+0

En hâte j'avais enlevé plus de code alors j'aurais dû ... J'ai édité le post. Merci pour le délai d'exécution rapide –

+0

Il manque toujours les arguments 'map'. Cela a fonctionné – Potatoswatter

Répondre

1

Le seul problème potentiel que je vois est l'initialisation du membre static, s'il y a plusieurs fichiers source. Essayez de le garder avec une fonction.

class Doh { 
private: 
    static std::map< std::string, Doh * > &get_map() { 
     static std::map< std::string, Doh * > someMap; 
     return someMap; // initialize upon first use 
    } 
    std::string stringValue_; 
public: 
    Doh(std::string str) : stringValue_(str) { 
     get_map().insert(
      std::make_pair 
       (this->stringValue_,this) 
     ); 
    } 
}; 
+0

- Je pensais que initialiseurs statiques seraient toujours dynamiques initializers précédera. –

0

Dans aucune des deux versions est-il un signe d'initialisation pour stringvalue_ - qu'est-ce que le débogueur vous montrer sur cette clé lorsque vous appuyez sur la carte géographique dans la version 1 du code? Comment ce champ est-il mis en place, et quel est son type?

Exécution dans le débogueur pour VS2008 devrait vous permettre d'affiner le point de défaillance dans la source <map>, j'aurais pensé.