Сокрытие ГСЧ внутри класса - PullRequest
1 голос
/ 05 декабря 2010

В настоящее время я реализую класс колоды, представляющий колоду из 52 карт.Он использует ускоренную библиотеку Random для перемешивания целых чисел, которые представляют карты.

#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

Ответы [ 3 ]

4 голосов
/ 05 декабря 2010

Если вы делаете ее нормальной переменной класса, инициализируйте ее в конструкторе:

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

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

Если вы делаете его статичным (похоже, что вы используете, поскольку вы используете gen из choosecard, который является статическим), вам все равно нужно объявление вне класса:

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

boost::mt19937 Deck::gen(std::time(0));
2 голосов
/ 05 декабря 2010

Это предположение, основанное на том, что я думаю, что вы сделали.Вам придется отделить определение от инициализации статического gen члена:

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

boost::mt19937 Deck::gen(std::time(0));
0 голосов
/ 05 декабря 2010
class Deck{
    boost::mt19937 gen;
    ...
};

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

Deck::Deck(uint32_t seed): gen(seed){
...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...