我想知道如何在一个类的不同实例之间共享一个类中的互斥对象。
现在,我有一个类Indexer,它有一个Boost互斥和condition_variable作为私有成员变量。我在main中创建了Indexer类的auto_ptr,并将Indexer的指针传递给另一个类Robot的实例。
我喜欢这样做:
std::auto_ptr<Indexer> index_service(new Indexer());
Robot a(*index_service.get());
Robot b(*index_service.get());
Robot c(*index_service.get());
机器人的构造函数是:
Robot(Indexer &index_service)
{
this->index_service = index_service;
}
机器人的头部看起来像:
class Robot
{
public:
Robot(Indexer &index_service);
private:
Indexer index_service;
};
但是,由于互斥是不可压缩的,所以我得到了一个错误。
我想让互斥和condition_variable共享ptrs,但我读到这可能会导致意外行为。
有人能告诉我做这件事的正确方法吗?
谢谢!
我不是C++大师,但引用传递和指针的混合似乎很麻烦。
具体来说:this->index_service = index_service;
但该值作为Indexer &index_service
传入由于本地index_service类型为Indexer index_service;
我认为这项任务意味着抄袭。
我假设您只想要Indexer
的一个实例,所以您实际上是想在Robot类中存储对它的引用。要做到这一点,您需要让您的构造函数获取一个指针(无论如何,*index_service.get()
调用都会得到这个指针)。此外,您还希望类变量是指针类型。
在类中声明一个静态boost::mutex。记得在.cpp文件中定义它。
点击此处:在类中使用静态互斥
正如另一个选项一样,您可以使用std::shared_ptr
代替std::auto_ptr
,并在Robot
类中更改Indexer to
std::shared_ptr`。
class Robot
{
public:
Robot( std::shared_ptr<Indexer> const &index_service)
{
this->index_service = index_service;
}
private:
std::shared_ptr<Indexer> index_service;
};
std::shared_ptr<Indexer> index_service(new Indexer());
Robot a(*index_service.get());
Robot b(*index_service.get());
Robot c(*index_service.get());