C++ 从传入的引用变量中分配引用变量

C++ Assigning reference variable from passed in reference variable?

本文关键字:引用 变量 分配 C++      更新时间:2023-10-16

我试图避免使用全局变量,因为我不知道代码将来需要如何扩展,所以我希望能够生成具有独立互斥锁的多个线程。我正在尝试将互斥体和条件变量传递到类构造函数中。

头文件:

class Receiver {
private:
    std::mutex & _global_mtx;
    std::condition_variable & _global_cv;
    bool & state;
public:
    // Construct
    Receiver(std::mutex &, std::condition_variable &, bool &);
};

代码文件:

/*-------------------------------------
    Construct
--------------------------------------*/
Receiver::Receiver(std::mutex & mtx, std::condition_variable & cv, bool & state){
    _global_mtx = mtx;
}

这显然会导致问题,因为_global_mtx已经声明为引用变量,所以我不确定如何将引用从 mtx 传递到 _global_mtx .

另外,我知道在声明引用时,您必须为其分配一个值以引用(可能是 NULL),那么有没有更好的方法来处理我正在做的事情? 我确信我不是第一个也是唯一一个遇到这种需求的人,但我不确定在哪里寻找答案。

引用不能默认初始化。他们必须提到一些东西。所以你必须初始化_global_mutex.在构造函数初始化列表中执行此操作:

Receiver::Receiver(std::mutex & mtx, std::condition_variable & cv, bool & state)
: _global_mtx(mtx),
  _global_cv(cv),
  state(state)
{
}

这同样适用于其他数据成员。

对我来说

,你的代码看起来有些混乱和混乱。

在大多数情况下,互斥锁(如果您使用的是互斥锁,则为关联的条件变量)应直接与某些数据相关联。换句话说:你有一段将在线程之间共享的数据。您将互斥锁与该数据相关联以保护它,因此一次只有一个线程可以访问数据。

在这种情况下,您通常希望使用共享数据的实例、互斥锁和(如果需要)条件变量来设计类。你几乎从不想单独创建它们,然后像你在问题中尝试的那样将它们提供给类。虽然可以使用成员初始值设定项列表修复初始化引用的近期(主要是语法)问题,但这很少是正确的答案。

在大多数情况下,正确的答案是让所有这些成员成为同一对象的成员,并提供对成员数据执行操作的成员函数,并根据需要锁定和解锁 mutext。