2014-03-18 58 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