我正在寻找处理不可复制对象的最佳实践.
我有一个互斥类,显然不应该是可复制的.我添加了一个私有拷贝构造函数来强制执行.
这破坏了代码 - 有些地方只需要修复,但我有一个通用的问题,一个类,使用互斥量作为数据成员,或通过继承,被插入到容器中.
这通常发生在容器初始化期间,因此互斥锁尚未初始化,因此可以,但没有复制构造函数它不起作用.更改容器以包含指针是不可接受的.
有什么建议吗?
pet*_*hen 11
三个解决方案:
1.使用指针 - 快速解决方法是使其成为指针的容器 - 例如a shared_ptr.
如果你的对象真的是不可复制的,那将是"好"的解决方案,并且不可能使用其他容器.
2.其他容器 - 或者,您可以使用非复制容器(使用就地构造),但它们不常见且与STL大部分不兼容.(我已经尝试了一段时间,但这根本不好)
如果您的对象是真正的不可复制的,那将是"上帝"解决方案,并且使用指针是不可能的.
[编辑]使用C++ 13,std :: vector允许inplace构造(emplace_back),并且可以用于实现移动语义的不可复制对象.[/编辑]
3.修复你的可复制性 - 如果你的类是可复制的,并且互斥锁不可复制,你"只需"修复复制构造函数和赋值运算符.
编写它们很痛苦,因为您通常必须复制并分配除互斥锁之外的所有成员,但通常可以通过以下方式简化:
template <typename TNonCopyable>
struct NeverCopy : public T
{
NeverCopy() {}
NeverCopy(T const & rhs) {}
NeverCopy<T> & operator=(T const & rhs) { return *this; }
}
Run Code Online (Sandbox Code Playgroud)
并将你的互斥成员改为
NeverCopy<Mutex> m_mutex;
Run Code Online (Sandbox Code Playgroud)
不幸的是,使用该模板会丢失Mutex的特殊构造函数.
[编辑]警告: "修复"复制CTor/asignment通常要求您在复制构造上锁定右侧,并在分配时锁定双方.不幸的是,没有办法覆盖copy ctor/assignment 并调用默认实现,所以NeverCopy没有外部锁定,这个技巧可能对你不起作用.(还有一些其他解决方法有其自身的局限性.)
如果一个对象是不可复制的,那么通常有一个很好的理由。如果有充分的理由,那么您不应该通过将其放入尝试复制它的容器来破坏它。