Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

See title.

I have:

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

What need I do from here to make Foo un-copyable?

Thanks!

like image 407
anon Avatar asked Jan 31 '10 22:01

anon


People also ask

How do I make something non-copyable?

The typical way to make a C++ object non-copyable is to explicitly declare a copy constructor and copy-assignment operator but not implement them. This will prevent the compiler from generating its own.

How do you make an object non-copyable in C++?

class NonCopyable { public: NonCopyable (const NonCopyable &) = delete; NonCopyable & operator = (const NonCopyable &) = delete; protected: NonCopyable () = default; ~NonCopyable () = default; /// Protected non-virtual destructor }; class CantCopy : private NonCopyable {};

What is boost :: NonCopyable?

Boost::noncopyable prevents the classes methods from accidentally using the private copy constructor. Less code with boost::noncopyable.

Can we create copy of same object C++?

In C++ copying the object means cloning. There is no any special cloning in the language. As the standard suggests, after copying you should have 2 identical copies of the same object.


2 Answers

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

like image 169
Klaim Avatar answered Sep 25 '22 06:09

Klaim


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

like image 35
Hans Passant Avatar answered Sep 22 '22 06:09

Hans Passant