1

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

我一直在编写许多使用不可复制成员的类。这些类永远不会通过我的源代码中的复制构造函数进行初始化。当我尝试在不提供自己的复制构造函数的情况下进行编译时,由于不可复制的成员对象,g++ 会抛出许多关于它如何无法构建默认复制构造函数的错误。

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

编辑: 是的......感觉很傻......我有一个案例,我在 boost::bind 调用中偶然调用了复制构造函数。学过的知识。

4

5 回答 5

9

使事物不可复制的常用方法是声明但不定义复制构造函数,并将其设为私有,因此任何东西都不能调用它。

该语言的下一个版本将提供一种明确的方式来抑制这些生成的函数

于 2010-04-27T19:53:39.947 回答
6

如果您实际上并没有导致调用复制构造函数,那么如果编译器无法生成一个,这不是错误。听起来您(可能间接地)导致使用复制构造函数。

您可以通过声明自己的复制构造函数来抑制编译器生成的编译器(如果您不使用它,则不需要定义它)。你可以把它放在private你班级的部分。

如果这将错误更改为无法访问复制构造函数或您收到链接错误,那么您确实正在使用复制构造函数,您需要分析为什么会这样。

于 2010-04-27T19:54:27.427 回答
3

不在当前版本的 C++ 中。在 C++ 0x 中,将有一种=delete;语法告诉它,如果您自己没有定义编译器将默认生成的特殊成员函数之一,您不想要它。

于 2010-04-27T19:52:58.700 回答
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
};
于 2010-04-27T19:57:58.263 回答
2

不 :)

如果您希望您的课程不可复制,请使用类似boost::noncopyable

class MyClass : private boost::noncopyable
{

}

或在声明私有复制构造函数的类定义中使用参数化宏。

于 2010-04-27T19:54:57.443 回答