代码之家  ›  专栏  ›  技术社区  ›  J. Polfer

退出复制构造函数

  •  1
  • J. Polfer  · 技术社区  · 14 年前

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

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

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

    编辑: 是啊。。。 觉得无聊 …我有一个案例,我在Boost::Bind调用中意外调用了复制构造函数。吸取教训。

    5 回复  |  直到 14 年前
        1
  •  6
  •   CB Bailey    14 年前

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

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

    如果这将错误更改为“复制构造函数不可访问”或“链接错误”,则说明确实要使用复制构造函数,需要分析原因。

        2
  •  9
  •   Wyzard    14 年前

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

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

        3
  •  3
  •   Jerry Coffin    14 年前

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

        4
  •  3
  •   Stephen C. Steel    14 年前

    在完全支持新的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
  •  2
  •   Ando SylviA    14 年前

    不:)

    如果你想让你的类不可复制,使用 boost::noncopyable

    class MyClass : private boost::noncopyable
    {
    
    }
    

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