【问题标题】:Random Number In-Class Initialisation随机数类内初始化
【发布时间】:2014-03-18 19:40:33
【问题描述】:

我目前正在创建一个类,我希望在每次创建对象时使用随机数初始化其中一个私有成员。以下代码没有问题:

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 中创建一个对象时,它将隐式创建随机数。有什么建议吗?

【问题讨论】:

  • 这个问题只是如何定义/初始化静态数据成员吗?你能发个SSCCE吗?
  • 我正在尝试使用 C++11 随机生成器和引擎实现与第一个代码块(每次创建对象时为该成员生成一个随机数)相同的功能。我不知道该怎么做,静态数据成员只是我的尝试,但它没有编译。我将它作为一种伪代码包含在内以表明我的意图。

标签: c++ c++11 random initialization


【解决方案1】:

您需要在类定义之外定义静态数据成员。例如,这将起作用:

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

【讨论】:

  • TIL:NSDM 的 brace-or-equal-initializers 中的名称查找与成员函数定义中的名称查找相同(推迟到类定义结束) .
  • 我会将静态数据成员封装成一个静态成员函数,以避免需要单独的类外定义,like so. 让链接器完成工作;)
  • 太棒了,确实有效。非常感谢,静态成员总是让我对定义和声明感到困惑。编辑:谢谢凯西,这是一些性感的代码。
猜你喜欢
  • 2018-10-12
  • 1970-01-01
  • 1970-01-01
  • 2016-12-24
  • 2019-08-10
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多