2014-03-18 61 views
2

我目前正在創建一個類,我希望每次創建對象時都要使用隨機數初始化其中一個私有成員。下面的代碼不會產生問題:隨機數類內初始化

private: 
    unsigned random = rand() % 10; 

我會,但是,喜歡用C++ 11個隨機引擎和分佈做到這一點。我想能夠做到沿着下面的代碼線的東西,它不會編譯,但會給出什麼,我試圖做一個總體思路:

private: 
unsigned random = distribution(mersenne_generator(seed)); 

static std::random_device seed_generator; 
static unsigned seed = seed_generator(); //So that it's not a new seed each time. 
static std::mt19937 mersenne_generator; 
static std::uniform_int_distribution<unsigned> distribution(0, 10); 

此代碼不能編譯,因爲我試圖在類中定義一些靜態成員。但是,我不確定在哪裏定義它們。我可以創建一個初始化所有內容的成員函數,但之後我必須在main中運行它,這是我不想要的。我想只是在類中對所有隨機定義進行分類,以便在main中創建一個對象時,它將隱式地創建隨機數。有什麼建議麼?

+0

這可能有助於http://stackoverflow.com/questions/11498304/generate-random-numbers-in-c-at-compile-time – imreal

+0

是這個問題只是如何定義/初始化靜態數據成員?你可以發佈[SSCCE](http://sscce.org)嗎? – dyp

+0

我試圖使用C++ 11隨機生成器和引擎來實現與第一個代碼塊(每次創建對象時爲該成員生成一個隨機數)相同的功能。我不知道如何去做,靜態數據成員只是我的嘗試,但它不能編譯。我把它作爲一種僞代碼來展示我的意圖。 – JamesLens

回答

7

您需要在類定義之外定義靜態數據成員。舉例來說,這將工作:

struct foo 
{ 
private: 
    unsigned random = distribution(mersenne_generator);  
    static std::random_device seed_generator; 
    static unsigned seed; 
    static std::mt19937 mersenne_generator; 
    static std::uniform_int_distribution<unsigned> distribution; 
}; 

std::random_device foo::seed_generator; 
unsigned foo::seed = seed_generator(); 
std::uniform_int_distribution<unsigned> foo::distribution(0, 10); 
std::mt19937 foo::mersenne_generator(foo::seed); 

的靜態數據成員的定義應該放在一個.cpp文件,否則你跑違反了一個定義規則的風險。

Live example

+1

TIL:在* brace-or-equal中查找名稱* NSDM的初始化程序與成員函數定義中的名稱查找相同(它被推遲到類定義的末尾)。 – dyp

+4

我會將靜態數據成員封裝到一個靜態成員函數中,以避免對單獨的超類定義的需求[如[](http://coliru.stacked-crooked.com/a/64c9a61056da2e03)讓鏈接器完成工作;) – Casey

+0

太棒了,那確實有效。非常感謝,靜態成員總是讓我困惑於定義與聲明。編輯:謝謝凱西,那是一些性感的代碼。 – JamesLens