选择退出复制构造函数

时间:2010-04-27 19:50:07

标签: c++ g++ default-copy-constructor

这可能是一个愚蠢的问题,但是......

我一直在写一些利用不可复制成员的课程。这些类永远不会通过我的源代码中的复制构造函数初始化。当我尝试编译而不提供自己的拷贝构造函数时,由于不可复制的成员对象,g ++抛出了很多关于如何无法构建默认拷贝构造函数的错误。

有没有办法告诉编译器不要给我一个复制构造函数?

编辑:是的... 感觉很傻 ...我有一个案例,我在boost :: bind调用中偶然地调用了copy-constructor。经验教训。

5 个答案:

答案 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
{

}

或在类定义中使用参数化宏来声明私有拷贝构造函数。