【问题标题】:c++ making random engine staticc ++使随机引擎静态
【发布时间】:2017-01-09 15:39:22
【问题描述】:

我正在尝试为我的随机助手类制作随机引擎:

当我使用此代码时它的工作原理:

Helper.h

#pragma once
class Helper
{
public:
    static int getRandomInt(int min, int max);
    static double getRandomDouble(double min, double max);
};

Helper.cpp

#include <random>
int Helper::getRandomInt(int min, int max)
{
    static std::default_random_engine randomEngine{};
    using Dist = std::uniform_int_distribution<int>;
    static Dist uid{};
    return uid(randomEngine, Dist::param_type{ min,max});
}

double Helper::getRandomDouble(double min, double max)
{
    static std::default_random_engine randomEngine{};
    using Dist = std::uniform_real_distribution<double>;
    static Dist uid{};
    return uid(randomEngine, Dist::param_type{ min,max });
}

所以我想为什么不使用相同的随机引擎并尝试:

Helper.h 添加:

static std::default_random_engine randomEngine;

helper.cpp 已更改:

//added randomEngine
std::default_random_engine Helper::randomEngine = std::default_random_engine{};

int Helper::getRandomInt(int min, int max)
{
    //removed randomeEngine 
    using Dist = std::uniform_int_distribution<int>;
    static Dist uid{};
    return uid(randomEngine, Dist::param_type{ min,max});
}

double Helper::getRandomDouble(double min, double max)
{
    //removed randomeEngine 
    using Dist = std::uniform_real_distribution<double>;
    static Dist uid{};
    return uid(randomEngine, Dist::param_type{ min,max });
}

当我尝试运行它时,我得到 10 个错误:

default_random_engine':不是'std'的成员

缺少类型说明符 - 假定为 int

当我添加一个静态 int(只是为了测试)时:

Helper.h

static int test;

Helper.cpp

int Helper::test = 3;

没有编译错误,创建静态随机引擎和创建静态int有什么区别?

注意:第一个示例正在运行,我已包含(否则第一个示例将无法运行)

【问题讨论】:

  • #include &lt;random&gt;?
  • 您需要包含适当的标题。默认情况下,C++ 不会找到所有 std:: 符号。
  • @MalcolmMcLean 我已经包含了标题,请注意第一个示例正在运行。
  • @SvenB:您需要在Helper.h 中包含&lt;random&gt;,而不是Helper.cpp
  • (a) 当所有方法都是静态的时,公共构造函数/析构函数的意义何在? (b) static std::default_random_engine randomEngine; 不属于你的头文件,只属于 cpp 文件。如果在头文件中声明,每个包含头文件的 cpp 文件都有自己的副本(从未使用过),

标签: c++ random


【解决方案1】:

这些错误表明您忘记在Helper.h 中包含&lt;random&gt; 标头。

Helper.h 更改为:

#pragma once
#include <random>

class Helper
{
    static std::default_random_engine randomEngine;

public:
    Helper();
    ~Helper();
    static int getRandomInt(int min, int max);
    static double getRandomDouble(double min, double max);
};

...应该可以解决您的问题。

【讨论】:

  • 你的权利,我完全忘了我需要移动包含。
  • @SvenB:不客气。如果它回答了您的问题,请不要忘记accept this answer
猜你喜欢
  • 2016-11-07
  • 1970-01-01
  • 1970-01-01
  • 2013-05-08
  • 1970-01-01
  • 2018-07-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多