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