代码之家  ›  专栏  ›  技术社区  ›  ckv

防止编译器定义C++类的复制构造函数和运算符=过载

  •  6
  • ckv  · 技术社区  · 14 年前

    7 回复  |  直到 14 年前
        1
  •  11
  •   PeterK    14 年前

        2
  •  6
  •   Pavel Radzivilovsky    14 年前

    (NIH也有办法做到这一点,为operator=和copy constructor声明私有的从未定义的方法,但是,请喜欢boost)。

        3
  •  3
  •   Evgen Bodunov    14 年前

    你自己声明这些函数并将它们私有化。另外,您也可以不编写该函数的定义,因此尝试使用这些函数的每个人都会得到一个链接器错误。

        4
  •  3
  •   MSalters    14 年前

    在C++ 0x中,你可以写

    class NonCopyable {
      NonCopyable & operator=(NonCopyable const&) = delete;
      NonCopyable(NonCopyable const&) = delete;
    };
    

    请注意,编译器不会生成转换 NonCopyable::operator=(Other const&) 在任何情况下都会过载。

        5
  •  2
  •   AnT stands with Russia    14 年前

    定义?嗯,是的。他们总是 宣布 (由您显式地或由编译器隐式地)但是它们只是 定义

    当然,如果“阻止编译器定义…”,您的意思是“阻止编译器定义…” 成功地 定义…,也就是说,如果您想使隐式定义尝试在编译时失败,那么您可以通过向类中添加非复制可构造和/或不可赋值的子对象(例如,具有私有复制构造函数和私有赋值运算符的基或成员)来实现这一点。

        6
  •  1
  •   Edward Strange    14 年前

    从在私有作用域中声明这些函数的类型继承,例如boost::noncopyable。

    或者…有一个引用成员变量:P

        7
  •  0
  •   Rob    14 年前

    如果你有时间使用Qt,那么你可以使用 Q_DISABLE_COPY 宏:

    class Foo
    {
    public:
      Foo();
    
    private:
      Q_DISABLE_COPY(Foo)
    };