Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于C++中的单个静态变量,是否有比类更好的选项?_C++ - Fatal编程技术网

对于C++中的单个静态变量,是否有比类更好的选项?

对于C++中的单个静态变量,是否有比类更好的选项?,c++,C++,当我有一个需要随机数生成器的程序时,我使用这个类,这样整个程序就可以在同一个rng上运行 #include <random> #include <ctime> using namespace std; class Rizzian { private: static mt19937 mt; public: void initialize() { mt.seed(unsigned(time(NULL))); } unsigne

当我有一个需要随机数生成器的程序时,我使用这个类,这样整个程序就可以在同一个rng上运行

#include <random>
#include <ctime>
using namespace std;

class Rizzian {
private:
    static mt19937 mt;
public:
    void initialize() {
        mt.seed(unsigned(time(NULL)));
    }
    unsigned int r() {
        return mt();
    }
};
当rng被初始化并且我有变量Rizzian rng时,我会得到带有rng.r的随机数

但是在Rizzian的定义之外有一行额外的代码让我觉得好像有更好的方法可以做到这一点,一般来说,一个静态变量的整个类感觉太过了。所以这只是我的预感。这里有些东西很臭


这不是关于RNG或mersenne龙卷风或其他任何东西的具体问题。有没有更好的方法使整个程序都可以访问静态变量?

仅此函数不需要类。函数还可以包含静态成员。带有static关键字的行只执行一次

#include <random>
#include <ctime>
#include <iostream>

using namespace std;

unsigned int rnd()
{
  static bool first_call = true;
  static mt19937 mt = mt19937();

  if (first_call)
  {
    mt.seed(unsigned(time(NULL)));
    first_call = false;
  }

  return mt();
}

int main()
{
  unsigned int r = rnd();
  std::cout << r << std::endl;

  for (int i=1; i<10; i++)
  {
    r = rnd();
    std::cout << r << std::endl;
  }
}
mt不应该是静态成员,但Rizzian实例(可能是全局的)是在其他地方创建的。查找singleton模式。初始化函数应该被更好的对象初始化所取代,但实际上,如果你想让它保持这种工作方式,这可能只是一个函数。
#include <random>
#include <ctime>
#include <iostream>

using namespace std;

unsigned int rnd()
{
  static bool first_call = true;
  static mt19937 mt = mt19937();

  if (first_call)
  {
    mt.seed(unsigned(time(NULL)));
    first_call = false;
  }

  return mt();
}

int main()
{
  unsigned int r = rnd();
  std::cout << r << std::endl;

  for (int i=1; i<10; i++)
  {
    r = rnd();
    std::cout << r << std::endl;
  }
}