默认构造函数设置随机值

时间:2017-12-09 16:42:20

标签: visual-studio class c++11 random default-constructor

我正在为原子对象编写一个简单的类。这是我到目前为止所写的内容:

#include <random>

class Atom {
    int mSpin;

public:
    Atom();
    Atom(int);
    Atom(const Atom&);
    ~Atom() {}

    Atom& operator= (const Atom &atom);
};

.cpp文件:

include "Atom.h"

Atom::Atom() {
}
Atom::Atom(int spin) : mSpin(spin) {}
Atom::Atom(const Atom& copy) : mSpin(copy.mSpin) {}

/*  OPERATORS  */

Atom& Atom::operator= (const Atom &copy) {
    mSpin = copy.mSpin;
    return *this;
}

我想制作默认构造函数,这样当我创建一个对象时,mSpin将被随机设置为1或-1。我理解如何使用rand(),但rand()不是很好,我想使用。即使在阅读了这里的文档和其他答案之后,我也对它的使用感到困惑。 通常我会做这样的事情:

#include <random>
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(0,1);
int random_number = dis(gen);

但我不确定如何在课堂上使用它。我尝试将它放在默认构造函数中,但我认为这是错误的,因为每次创建一个原子时它都会播种?

希望问题很清楚。

2 个答案:

答案 0 :(得分:0)

您应该使随机设备和生成器成为Atom类的静态成员。这样,就像全局变量一样,它们只在程序的持续时间内初始化一次。

class Atom {
  // declaration
  static std::random_device rd;
  static std::mt13397 gen;

  ...
};

// definition - this must be in Atom.cpp
std::random_device Atom::rd;
std::mt13397 Atom::gen(Atom::rd());

答案 1 :(得分:0)

您可以委托cpp文件中的函数:

namespace {                                                                                                                                                  
    random_device rd;                                                                                                                                            
    mt19937 gen(rd());                                                                                                                                           
    uniform_int_distribution<> dis(0,1);                                                                                                                                                                                                                                                                                 
}                                                                                                                                                            
int spin() {                                                                                                                                                                                                                                                                                                              
    return dis(gen) == 0 ? -1 : 1;                                                                                                                           
}                                                                                                                                                             

删除默认CTOR的实现。

并遵循规则&#39;初始化所有变量&#39;改变Atom.hpp:

int spin(); // Return -1 or 1, randomly

class Atom {
    int mSpin = spin();
public:
    Atom() = default;
    ...
};

然后,在您的cpp文件中,删除您的Atom默认CTOR实施并移动&#39;旋转&#39;函数定义来自匿名命名空间。