2010-06-21 43 views

回答

11

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

+0

请注意,这不会阻止这些函数的*声明,因为您刚刚自己声明了它们,编译器在适当的时候可能仍会考虑它们。 – 2013-06-21 15:31:23

2

定义?嗯,是。它们总是宣称为(明确由你自己或由编译器默认),但它们只是由编译器定义的当/如果你真的使用它们。不要使用它们 - 编译器不会定义它们。当然,如果通过“阻止编译器定义......”,你的意思是“阻止编译器从成功地定义 ...”,即如果你想在编译时使隐式定义尝试失败,那么您可以通过向类中添加非复制可构建和/或不可分配的子对象(例如,使用私有复制构造函数和专用赋值运算符的基础或成员)来实现此目的。

+0

@Matthieu M .:首先,什么是“不一定”? 'const'成员是一个不可分配的子对象。其次,你所说的不完全正确。复制分配*总是被声明为*。正如我在我的回答中所说的那样,在“const”成员的情况下,将会失败的* definition *尝试。 – AnT 2010-06-21 08:03:17

6

是的。从boost :: noncopyable派生。 (也有NIH的方法,通过声明operator =和private构造函数的私有的未定义方法,但是,请喜欢boost)。

3

自己声明这些函数并将它们设为私有。你也可以不写这个函数的定义,所以每个试图使用这些函数的人都会得到一个链接器错误。

1

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

还是......有一个参考成员变量:P

0

FWIW如果你避开使用Qt,那么你可以使用Q_DISABLE_COPY宏:

class Foo 
{ 
public: 
    Foo(); 

private: 
    Q_DISABLE_COPY(Foo) 
}; 
3

在C++ 0x中,你马上就能写出

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

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

+0

这样你就会得到更好的错误信息,至少在我看来。 – 2010-06-21 13:26:57