【问题标题】:Opt-out of copy constructor选择退出复制构造函数
【发布时间】:2010-04-27 19:50:06
【问题描述】:

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

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

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

编辑: 是的……感觉很傻……我曾经在 boost::bind 调用中偶然调用了复制构造函数。经验教训。

【问题讨论】:

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


    【解决方案1】:

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

    该语言的下一个版本将提供explicit way to suppress these generated functions

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          在完全支持新的 C++ 0x 标准之前,您能做的最好的事情就是声明特殊成员函数的版本,但不实现它们。通常它们是私有的(以帮助明确它们不应该被使用)。

          
          Class foo
          {
              // ... rest of definition
              private:
                  foo (const foo& rhs); // Do Not Implement
                  const foo& operator= (const foo& rhs); // Do Not Implement
          };
          

          【讨论】:

            【解决方案5】:

            没有:)

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

            class MyClass : private boost::noncopyable
            {
            
            }
            

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-04-05
              • 1970-01-01
              • 1970-01-01
              • 2014-07-18
              • 1970-01-01
              • 1970-01-01
              • 2013-10-13
              • 1970-01-01
              相关资源
              最近更新 更多