如何将提升正常分发存储为类成员
How to a store a boost normal distrubution as a class member
我有一个类,用于初始化构造函数中的boost::normal_distribution
对象。 如何将此对象存储在成员中,以便它在类中的其他位置可用? 我想我想存储一个指向 boost 对象的指针,但是一旦我离开构造函数,该对象就会从堆栈中释放出来。所以,我想我真的很想用new
在堆上分配正态分布对象,但我无法获得正确的语法。
class Generator
{
private:
boost::variate_generator<boost::mt19937&,
boost::normal_distribution<> > *_var_nor;
public:
Generator( int avg_size, int stddev_size )
PhraseGenerator( size, words );
boost::mt19937 rng; // I don't seed it on purpouse (it's not relevant)
boost::normal_distribution<> nd(avg_size, stddev_size);
boost::variate_generator<boost::mt19937&,
boost::normal_distribution<> > var_nor(rng, nd);
_var_nor = &var_nor;
};
int normal_distrib_value()
{
return (*_var_nor)();
}
};
如果希望 Generator 类型的所有对象共享同一个成员,则应将其声明为静态。
例:
// in Generator.h
class Generator
{
private:
static boost::variate_generator<boost::mt19937,
boost::normal_distribution<> > _var_nor;
// ...
};
// in Generator.cpp
#include "Generator.h"
boost::variate_generator<boost::mt19937,
boost::normal_distribution<> > Generator::_var_nor{
boost::mt19937{},
boost::normal_distribution<>{}
};
// ...
在您的示例中,一旦构造函数退出,_var_nor
将指向不再存在的对象,以后任何取消引用它的尝试都将是未定义的行为。你可以new
normal_distribution
,但这不是你需要new
的唯一事情。请注意,variate_generator
的第一个模板参数是boost::mt19937&
,因此它仅存储对 Mersenne Twister 的引用,而不是复制它,因此您也会遇到相同的问题。您可以将参数类型更改为非引用,也可以new
mt19937
。
无论如何,有一个更简单的解决方案,它不涉及指针或new
。只需使所有 3 个、mt19937
、normal_distribution
和variate_generator
成为您班级的成员即可。请记住,您声明它们的顺序很重要,因为这是它们初始化的顺序。
class Generator
{
private:
boost::mt19937 _rng;
boost::normal_distribution<> _nd;
boost::variate_generator<boost::mt19937&,
boost::normal_distribution<> > _var_nor;
public:
Generator( int avg_size, int stddev_size )
: _nd(avg_size, stddev_size)
, _var_nor(_rng, _nd)
{
PhraseGenerator( size, words );
}
int normal_distrib_value()
{
return _var_nor();
}
};
相关文章:
- 访问存储在向量C++中的结构的多态成员
- 如何创建存储指向成员函数的指针的类 (C++)
- 哪些存储了不完整类型的 STL 数据结构可以用作类成员?
- 使用成员函数和存储值定义书籍类
- 指向(数据)成员的指针作为非类型模板参数,例如具有自动存储持续时间/无链接
- 在C++中,如果成员引用在其声明中初始化,为什么需要存储空间?
- 通过放置 new 重用数据成员存储
- 如何将提升正常分发存储为类成员
- C++:将未知类型的对象存储为成员变量的类
- structtm是否将时区信息存储为其数据成员
- 是否值得使用位移在单个字节中存储多个小数据成员?
- 将列表迭代器存储为成员
- 是否有更好的方法来封装成员对象可以访问的共享存储池?
- 流的奇怪问题.不能存储具有特定值的成员变量的对象
- 不从成员函数C 存储返回值认为不良习惯
- 在数据结构中存储成员函数
- 如何通过接口存储成员函数指针
- 存储成员指针与成员值
- 存储成员函数的位置
- GCC如何在内存中存储成员函数