C ++ 11通过允许您使用“= delete”语法将隐式编译器定义的方法标记为verboten来解决长期困扰我的问题。 Wikipedia for more info.
class Foo
{
public:
Foo();
~Foo();
// No copy
Foo(Foo const &) = delete;
Foo& operator=(Foo const &) = delete;
};
我不希望复制或分配的类的复制和赋值运算符总是很难搞乱。这是很多锅炉板代码,使它们成为私有的,然后通常会有成员数据,没有一个默认的构造函数,需要一些挥手让编译器对你想要没有人打电话的函数感到高兴。 / p>
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。处理这些问题的最佳方法是什么? (请告诉我有比第二个代码片段更好的方法。)
答案 0 :(得分:6)
您正在编写所有额外废话因为您实际上正在定义deleted
运算符的正文 - 我认为您不必这样做,而我所做的是只是在没有任何实现的情况下进行声明,像这样;
class Bar
{
public:
explicit Bar(UniqueResourceID id): m_data(id) { }
~Bar();
protected:
SomeHandle m_data; // no default constructor
private:
Bar();
Bar(Bar const &o);
Bar& operator =(Bar const &o);
};
这并不比编写附加= delete
的方法更详细。
编辑:您对
的定义....
private:
Bar() {}
实际上很危险,因为它允许从Bar
内的其他方法调用操作符而不会产生任何错误(链接器或编译器)