0

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

2 回答 2

3

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)))。

于 2013-10-02T11:44:29.797 回答
1

问题是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;
}
于 2013-10-02T11:50:11.460 回答