【发布时间】:2014-11-28 20:57:30
【问题描述】:
C++11 允许您使用“= delete”语法将隐式编译器定义的方法标记为禁止使用,从而解决了长期以来困扰我的问题。 Wikipedia for more info.
class Foo
{
public:
Foo();
~Foo();
// No copy
Foo(Foo const &) = delete;
Foo& operator=(Foo const &) = delete;
};
对于我不希望复制或分配的类的复制和赋值运算符总是很麻烦。将它们设为私有需要大量样板代码,然后通常存在没有默认构造函数的成员数据,需要一些手动操作才能使编译器对您不希望任何人调用的函数感到满意。
class Bar
{
public:
explicit Bar(UniqueResourceID id): m_data(id) { }
~Bar();
protected:
SomeHandle m_data; // no default constructor
// all this crap to keep from being able to copy. Do not use any of these!!
private:
Bar() { } // ERROR: m_data has no default constructor
static UniqueResourceID s_invalidID; // now I'm making the problem worse,
// because I don't actually need this
// for anything real, except to shut
// up some errors.
Bar(Bar const &o): m_data(s_invalidID) { }
Bar& operator =(Bar const &o): { return *this; }
};
不幸的是,我必须使用的一些编译器不是 C++11 编译器,也不提供 =delete。处理这些的最好方法是什么? (请告诉我有比第二个代码 sn-p 更好的方法。)
【问题讨论】:
-
让他们
private。 -
从
privatedecl 的Bar() {}中删除{}。 IE。Bar();。你只需要声明它,而不是实现它。适用于所有。如果您在这样做之后发现您的代码没有链接,那么您的朋友或class Bar中的某些东西指的是您试图掩盖的东西。在这种情况下,修复错误的调用者。 -
有些人认为派生自
boost::noncopyable或类似的一种更好的方法:它简洁且直接表达意图。另见:stackoverflow.com/q/7823990 -
@dyp Boost 并非总是在所有平台上都可用/理想,但这是一个好点。感谢您的建议。
-
@PhilippeChaintreuil 编写自己的程序非常简单:基本上与您当前所做的相同,但在一个单独的类中。类似
class noncopyable { noncopyable(noncopyable const&); noncopyable& operator=(noncopyable const&); public: noncopyable() {} };
标签: c++ copy-constructor c++03 c++98