在C ++ 03中用于限制复制/赋值操作的最简单方法是删除=删除的最简单方法是什么?

时间:2014-10-03 18:56:59

标签: c++ copy-constructor c++03 c++98

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。处理这些问题的最佳方法是什么? (请告诉我有比第二个代码片段更好的方法。)

1 个答案:

答案 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内的其他方法调用操作符而不会产生任何错误(链接器或编译器)