如何在构造函数中使用uniform_int_distribution作为类字段

How to use uniform_int_distribution as the class field in constructor

本文关键字:distribution int 字段 uniform 构造函数      更新时间:2023-10-16

如何使用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;
}