How do I make this C++ object non-copyable?

前端 未结 10 856
太阳男子
太阳男子 2020-11-28 04:36

See title.

I have:

class Foo {
   private:
     Foo();
   public:
     static Foo* create();
}

What need I do from here to make Fo

相关标签:
10条回答
  • 2020-11-28 05:19

    Make the copy constructor and the assignment operator private as well. Just the declaration is enough, you don't have to provide an implementation.

    0 讨论(0)
  • 2020-11-28 05:20

    Just another way to disallow copy constructor,For convenience, a DISALLOW_COPY_AND_ASSIGN macro can be used:

    // A macro to disallow the copy constructor and operator= functions
    // This should be used in the private: declarations for a class
    #define DISALLOW_COPY_AND_ASSIGN(TypeName) \
      TypeName(const TypeName&) = delete;      \
      void operator=(const TypeName&) = delete
    

    Then, in class Foo:

    class Foo {
     public:
      Foo(int f);
      ~Foo();
    
     private:
      DISALLOW_COPY_AND_ASSIGN(Foo);
    };
    

    ref from google style sheet

    0 讨论(0)
  • 2020-11-28 05:25

    This is what I use:

    /* Utility classes */
    
    struct NoCopy
    {
    public:
        NoCopy() {}
    private:
        NoCopy(const NoCopy &);
    };
    
    struct NoAssign
    {
    private:
        NoAssign &operator=(const NoAssign &);
    };
    
    struct NonInstantiable
    {
    private:
        NonInstantiable();
    };
    
    struct NoCopyAssign : NoCopy, NoAssign
    {
    };
    typedef NoCopyAssign NoAssignCopy;
    

    In your case:

    struct Example : NoCopy
    {
    };
    
    0 讨论(0)
  • 2020-11-28 05:26
    class Foo {
       private:
         Foo();
         Foo( const Foo& ); // non construction-copyable
         Foo& operator=( const Foo& ); // non copyable
       public:
         static Foo* create();
    }
    

    If you're using boost, you can also inherit from noncopyable : http://www.boost.org/doc/libs/1_41_0/boost/noncopyable.hpp

    EDIT: C++11 version if you have a compiler supporting this feature:

    class Foo {
       private:
         Foo();
       public:
         Foo( const Foo& ) = delete; // non construction-copyable
         Foo& operator=( const Foo& ) = delete; // non copyable
    
         static Foo* create();
    }
    

    Note that deleted methods should be public: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rc-delete

    0 讨论(0)
提交回复
热议问题