防止编译器为C ++类定义复制构造函数和operator =重载

时间:2010-06-21 07:50:12

标签: c++ class

有没有办法阻止编译器为C ++类定义复制构造函数,operator = overload。

7 个答案:

答案 0 :(得分:11)

您可以将这些函数声明为private,以防止人们在使用您的类时使用它们,同时阻止编译器生成它们。

答案 1 :(得分:6)

是。派生自boost :: noncopyable。

(还有NIH的方法,通过声明operator =和copy构造函数的私有永不定义的方法,但是,请喜欢提升)。

答案 2 :(得分:3)

自己声明这些功能并将其设为私有。此外,您可以不编写该函数的定义,因此每个尝试使用这些函数的人都会收到链接器错误。

答案 3 :(得分:3)

在C ++ 0x中,您将能够编写

class NonCopyable {
  NonCopyable & operator=(NonCopyable const&) = delete;
  NonCopyable(NonCopyable const&) = delete;
};

请注意,编译器在任何情况下都不会生成转换NonCopyable::operator=(Other const&)重载。

答案 4 :(得分:2)

定义?嗯,是。它们总是声明(由您明确地或由编译器隐式声明),但是当/实际使用它们时,它们仅由编译器定义。不要使用它们 - 编译器不会定义它们。

当然,如果通过“阻止编译器定义...”,则表示“阻止编译器成功定义...”,即如果要使隐式定义尝试失败,编译时,然后你可以通过向你的类添加非复制可构造和/或不可赋值的子对象来实现这一点(例如,像具有私有拷贝构造函数和私有赋值运算符的基类或成员)。

答案 5 :(得分:1)

继承自在私有范围内声明这些函数的类型,例如boost :: noncopyable。

或者......有一个参考成员变量:P

答案 6 :(得分:0)

FWIW如果您曾经使用过Qt,那么您可以使用Q_DISABLE_COPY宏:

class Foo
{
public:
  Foo();

private:
  Q_DISABLE_COPY(Foo)
};