提高互斥量和类成员访问

Posted

技术标签:

【中文标题】提高互斥量和类成员访问【英文标题】:Boost mutex and class member access 【发布时间】:2013-04-28 13:01:32 【问题描述】:

我在尝试使用BOOST threads 1.53.0 时遇到了问题。由于我是 BOOST 的新手,我现在遇到一个问题,项目中的大型类需要进行一些线程模式处理。

在编译代码时,我不断收到错误:

error C2248: 'boost::mutex::mutex' : cannot access private member declared in class 'boost::mutex'

在线阅读我发现使用 Boost 的 lock_guard,结果如下所示的语句

PointPorcessor processor = PointProcessor(x,y,z);

正在创建类的实例并将其分配给processor 变量。 (或者我错了吗?)。这基本上意味着 boost 现在将允许复制互斥体

类本身

PointProcessor

boost::mutex mtex; // The one and only mutex
// Other members
;

我可以使用指针代替 PointProcessor* 处理器 = 新 PointProcessor(x,y,z) 问题是,这是一个大型代码库,我不想将其余的实现更改为 PointProcessor* processor = new PointProcessor,因为它们只是 PointProcessor processor = PointProcessor(x,y,z)

【问题讨论】:

【参考方案1】:

问题出在这里:

PointPorcessor processor = PointProcessor(x, y, z);

您正在通过复制初始化创建processor,其中PointProcessor 类型的临时对象首先被默认构造,然后processor 被复制构造或移动构造暂时的。

但是,boost::mutex 是不可复制和不可移动的(前提是您使用的 Boost 版本完全支持移动语义),这就解释了为什么 processor 的复制初始化是非法的。

你应该通过直接初始化来构造你的对象,这样:

PointProcessor processor(x, y, z);

【讨论】:

@Wajih:编辑了答案:) @Wajih:当然,慢慢来,让我知道 :) 老兄是男人 :) 我想我必须重新开始学习 C++!真的谢谢你!

以上是关于提高互斥量和类成员访问的主要内容,如果未能解决你的问题,请参考以下文章

静态类和类成员

在Java和c#中如果不写访问修饰符,类和类成员默认的是啥访问修饰符?

对象和类

在Java和c#中如果不写访问修饰符,类和类成员默认的是啥访问修饰符?

面向对象中对象和类以及如何访问类中属性和方法

C++ 派生类访问属性