2010-12-04 26 views
1

Je suis actuellement en train d'implémenter une classe Deck qui représente un jeu de 52 cartes. Il utilise la bibliothèque Random boost pour mélanger les entiers qui représentent les cartes.Masquage de RNG à l'intérieur de la classe

#include <iostream> 
#include <fstream> 
#include "constants.hpp" 
#include <boost/program_options.hpp> 

#include <vector> 
#include <boost/random/mersenne_twister.hpp> 
#include <boost/random/uniform_int.hpp> 
#include <boost/random/variate_generator.hpp> 

boost::mt19937 gen(std::time(0)); 

class Deck{ 
    private: 
     std::vector<int> cards; 
     int cardpointer; 
     static ptrdiff_t choosecard(ptrdiff_t i); 
     ptrdiff_t (*pchoosecard)(ptrdiff_t); 
    public: 
     Deck(); 
     void shuffle(); 
     int pop(); 
}; 

Deck::Deck(){ 
    for(int i=1; i<=52; i++){ 
     cards.push_back(i); 
    } 
    cardpointer = -1; 
    pchoosecard = &choosecard; 
} 

ptrdiff_t Deck::choosecard(ptrdiff_t i){ 
    boost::uniform_int<> dist(0,i); 
    boost::variate_generator< boost::mt19937&, boost::uniform_int<> > cardchoice(gen, dist); 
    return cardchoice(); 
} 

void Deck::shuffle(){ 
    std::random_shuffle(cards.begin(), cards.end(), pchoosecard); 
} 

Je veux déplacer le "boost :: mt19937 gen (std :: time (0));" ligne pour faire partie de la classe, mais je vais avoir des problèmes à faire, puisque je reçois cette erreur quand je me déplace dans la définition de classe:

$ make 
g++ -I /usr/local/boost_1_45_0/ -c main.cpp 
main.cpp:22: error: ‘std::time’ is not a type 
main.cpp:22: error: expected ‘)’ before numeric constant 
main.cpp:22: error: expected ‘)’ before numeric constant 
main.cpp:22: error: expected ‘;’ before numeric constant 
main.cpp: In static member function ‘static ptrdiff_t Deck::choosecard(ptrdiff_t)’: 
main.cpp:39: error: ‘gen’ was not declared in this scope 
make: *** [main.o] Error 1 
+0

Est-ce que le code affiché correspond au même code compilé pour obtenir ces messages d'erreur? –

+0

Voulez-vous un membre de données 'static' (partagé par chaque instance de la classe Deck') ou un membre non static (séparé pour chaque instance)? –

Répondre

4

Si vous effectuez une variable de classe normale, initialize dans le constructeur:

class Deck { 
    ... 
    public: 
     boost::mt19937 gen; 
}; 

Deck::Deck() : gen(std::time(0)) 
{ 
    ... 
} 

Si vous rendant statique (il semble que vous êtes, puisque vous utilisez gen de choosecard, qui est statique), vous avez encore besoin d'une déclaration en dehors de la classe:

class Deck { 
    ... 
    public: 
     static boost::mt19937 gen; 
}; 

boost::mt19937 Deck::gen(std::time(0)); 
2

Ceci est une supposition basée sur ce que je pense que vous avez fait. Vous devrez séparer la définition de l'initialisation du membre gen statique:

class Deck { 
    static boost::mt19937 gen; 
    // ... 
}; 

boost::mt19937 Deck::gen(std::time(0)); 
0
class Deck{ 
    boost::mt19937 gen; 
    ... 
}; 

Deck::Deck(): gen(std::time(0)){ 
... 
} 

Deck::Deck(uint32_t seed): gen(seed){ 
... 
}