2010-12-04 127 views
1

我目前正在實施代表52張牌的甲板課程。它使用boost隨機庫來洗牌代表牌的整數。隱藏課堂上的RNG

#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); 
} 

我想移動「boost :: mt19937 gen(std :: time(0));」線是類的一部分,但我有這樣的問題的話,因爲我得到這個錯誤,當我移動它到類定義:

$ 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

請問您發佈對應相同代碼的代碼編譯,你讓那些錯誤信息? – 2010-12-04 23:49:39

回答

4

如果你讓一個普通的類變量,初始化它在構造函數中:

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

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

如果你讓靜態的(它看起來像你,因爲你使用genchoosecard,這是靜態的),你仍然需要在類的外部聲明:

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

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

這是基於我認爲你所做的一個猜測。你必須定義從靜態gen成員的初始化分開:

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){ 
... 
}