如何在构造函数中使用uniform_int_distribution作为类字段
How to use uniform_int_distribution as the class field in constructor
如何使用uniform_int_distribution作为构造函数中的类字段。我是++的新手。我正在尝试下一个方法,只是得到了错误。
class RandomConnectionsProvider : RandomProviderBase
{
public:
RandomConnectionsProvider(mainDataType operatorsCount);
~RandomConnectionsProvider(void);
static mainDataType GetNextConnectedOper();
private:
uniform_int_distribution<int>* connections_dist;
static random_device rd;
static mt19937 rnb;
};
RandomConnectionsProvider::RandomConnectionsProvider(mainDataType operatorsCount)
{
uniform_int_distribution<int> op_dist(1, OperatorsCount);
connections_dist = &op_dist;
}
mainDataType RandomConnectionsProvider::GetNextConnectedOper()
{
return *connections_dist(rnb);//Triing to dereference as i remember it but got error there
}
connections_dist
指向构造函数中的局部变量。当构造函数返回时,此局部变量将被销毁,因此指针将不再指向有效对象。
相反,我建议你跳过指针的使用,而是做这样的事情:
class RandomConnectionsProvider : RandomProviderBase
{
std::uniform_int_distribution<int> connections_dist; // Note: no pointer
// ...
public:
RandomConnectionsProvider::RandomConnectionsProvider(mainDataType operatorsCount)
: connections_dist(1, operatorsCount)
{ }
// ...
};
构造函数中冒号后面的部分称为初始值设定项列表,用于初始化对象中的成员变量。
不使用指针也将帮助您修复其他错误,因为您不需要使用取消引用。顺便说一下,该错误是因为函数调用的运算符优先级高于取消引用运算符(因此编译器认为您正在执行*(connections_dist(rnb))
)。
问题是本地op_dist
对象在构造函数完成时被销毁,因此之后无法使用它。您的connections_dist
指向无效内存。
您有 2 种可能的解决方案:
1. 不要使用指针,而是使用对象成员:
直接使用 uniform_int_distribution<int> connections_dist
并使用初始值设定项列表对其进行初始化,如下所示:
RandomConnectionsProvider::RandomConnectionsProvider(mainDataType operatorsCount)
: connections_dist ( 1, OperatorsCount )
{
}
2. 动态分配对象,从而延长其生存期:
您需要在析构函数中再次删除它,如下所示:
RandomConnectionsProvider::RandomConnectionsProvider(mainDataType operatorsCount) {
connections_dist = new uniform_int_distribution<int>(1, OperatorsCount);
}
RandomConnectionsProvider::~RandomConnectionsProvider() {
delete connections_dist;
}
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 是否可以从int转换为enum类类型
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 'short int'持有的值溢出,但"自动"不会溢出?
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 调用'begin(int [n])'没有匹配函数
- 没有显式声明的int[]中的foreach
- 在c++中访问int到类对象的映射时出错
- 为什么我无法更改"set<set>"循环中的值<int>
- 长 长 int 不要 长 int 好
- C++程序在循环后给出奇怪的int值
- 如何计算数据类型的范围,例如int
- 如果"new int"返回"int*",那么为什么"new int[n]"不返回"int**"?
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)