有没有办法阻止编译器为C ++类定义复制构造函数,operator = overload。
答案 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)
};