这可能是一个愚蠢的问题,但是......
我一直在写一些利用不可复制成员的课程。这些类永远不会通过我的源代码中的复制构造函数初始化。当我尝试编译而不提供自己的拷贝构造函数时,由于不可复制的成员对象,g ++抛出了很多关于如何无法构建默认拷贝构造函数的错误。
有没有办法告诉编译器不要给我一个复制构造函数?
编辑:是的... 感觉很傻 ...我有一个案例,我在boost :: bind调用中偶然地调用了copy-constructor。经验教训。
答案 0 :(得分:9)
使事物不可复制的通常方法是声明但不定义复制构造函数,并将其设置为私有,这样就无法调用它。
该语言的下一版本将提供explicit way to suppress these generated functions。
答案 1 :(得分:6)
如果您实际上没有调用copy-constructor,那么如果编译器无法生成复制构造函数则不会出错。听起来你(可能间接地)导致使用拷贝构造函数。
您可以通过声明自己的复制构造函数来抑制编译器生成的编译器(如果您不使用它,则无需定义它)。您可以将其放在班级的private
部分。
如果这改变了错误,说复制构造函数不可访问或者你得到链接错误,那么你真的会导致使用copy-construtor,你需要分析它的原因。
答案 2 :(得分:3)
不在当前版本的C ++中。在C ++ 0x中,会有一个=delete;
语法告诉它你不需要编译器默认生成的一个特殊成员函数,如果你自己没有定义它。
答案 3 :(得分:3)
在完全支持新的C ++ 0x标准之前,您可以做的最好的方法是对特殊成员函数的版本进行声明,但不实现它们。通常它们是私有的(以帮助说明它们不应该被使用)。
Class foo
{
// ... rest of definition
private:
foo (const foo& rhs); // Do Not Implement
const foo& operator= (const foo& rhs); // Do Not Implement
};
答案 4 :(得分:2)
没有:)
如果您希望自己的课程不可复制,请使用boost::noncopyable
class MyClass : private boost::noncopyable
{
}
或在类定义中使用参数化宏来声明私有拷贝构造函数。