C++ Can';不要在类实现中使用类字段
这给了我C3867:(您试图获取成员函数的地址,但没有使用其类名和运算符地址限定成员函数。)C++ Can';不要在类实现中使用类字段,c++,class,C++,Class,这给了我C3867:(您试图获取成员函数的地址,但没有使用其类名和运算符地址限定成员函数。) /.h 类实体 { 私人: const std::ranlux24_基随机_引擎(std::随机_设备); 作废打印(); }; //.cpp void实体::Print() { 标准:均匀分布均匀分布(0,10); 不能这样做。您正在.cpp文件中重新定义类。您不应该这样做 //.h class Entity { private: const std::ranlux24_base ra
/.h
类实体
{
私人:
const std::ranlux24_基随机_引擎(std::随机_设备);
作废打印();
};
//.cpp
void实体::Print()
{
标准:均匀分布均匀分布(0,10);
不能这样做。您正在.cpp文件中重新定义类。您不应该这样做
//.h
class Entity
{
private:
const std::ranlux24_base random_engine(std::random_device);
void Print();
};
//.cpp
void Entity::Print()
{
std::uniform_int_distribution<int> uniform_dist(0, 10);
cout << uniform_dist(random_engine);
}
/.h
类实体
{
私人:
const std::ranlux24_基随机_引擎(std::随机_设备);
作废打印();
};
//.cpp
void实体::Print()
{
标准:均匀分布均匀分布(0,10);
cout我相信您需要一个随机设备和prng引擎,作为.cpp文件中的静态类成员或局部变量。在C++11中,分发对象使用提供的随机引擎(使用设备提供的初始种子进行正确种子)生成其分发。重要的是,您只需构建一次设备,并提供种子如果可能的话,只要看一看你所展示的“有效”的代码,它就是这样做的
因此,如果您希望避免在每次调用Entity::Print()
时重新创建设备和引擎,您有几个选项。其中一个选项是使它们成为类静态成员:
在标题中:
class Entity
{
private:
static std::random_device rd;
static std::ranlux24_base rng;
void Print();
};
在.cpp文件中:
std::random_device Entity::rd;
std::ranlux24_base Entity::rng(Entity::rd());
void Entity::Print()
{
std::uniform_int_distribution<int> uniform_dist(0, 10);
std::cout << uniform_dist(rng);
}
void Entity::Print()
{
static std::random_device rd;
static std::ranlux24_base rng(rd());
std::uniform_int_distribution<int> uniform_dist(0, 10);
std::cout << uniform_dist(rng);
}
在cpp文件中:
void Entity::Print()
{
static std::random_device rd;
static std::ranlux24_base rng(rd());
std::uniform_int_distribution<int> uniform_dist(0, 10);
std::cout << uniform_dist(rng);
}
void实体::Print()
{
静态std::随机_设备rd;
静态标准::ranlux24_基础rng(rd());
标准:均匀分布均匀分布(0,10);
std::您是否可以将random\u engine
声明为成员函数(返回const std::ranlux24\u base
并获取类型为std::random\u device
的一个参数).你打算改为数据成员吗?是的…数据成员…就像C#中的字段一样,不是每次都会重新创建本地静态吗?我对性能和内存非常匹配…@Brans No.这是一次性成功。上述两种情况都将创建一个设备和引擎对象(除非Entity
是一个模板类,在这种情况下,每扩展一个类型就有一个)。这就是我将它们设置为static
的原因。我有点想你会有很多Entity
对象执行它们的Print()
operation.yes我有很多实体对象..我没有使用种子值。当我们使用随机设备而不是种子时,我们会得到不可预测的序列(我需要这个)价值观AFAK@Brans我也这么认为。上面的代码应该满足您的要求,很可能第二个示例就足够了。只是不要使用设备。如果您想要一个可复制的序列,请使用定义的种子。我可以使用time()对于一粒种子来说,但这个装置有什么不好呢?它是特别的,所以我下结论说它可能是bertter。。
class Entity
{
private:
void Print();
};
void Entity::Print()
{
static std::random_device rd;
static std::ranlux24_base rng(rd());
std::uniform_int_distribution<int> uniform_dist(0, 10);
std::cout << uniform_dist(rng);
}