Effective C++ Item6 如何阻止对象拷贝函数?

在书中介绍了两种方式,第一种很简单,直接把对象拷贝函数放在protected/private中并且不做实现。缺点是该类的成员函数还是能调用对象拷贝函数,但会在link时期报错。

class Cat
{
public:
	Cat(){}
	Cat(const string &s, const int &v):name(s), age(v){}

	void CopyCat()
	{
		Cat a;
		Cat b(a);
	}
private:
	string name;
	int age;
	Cat(const Cat &rhs);
	Cat& operator=(const Cat &rhs);
};


第二种比较复杂,但是可以在compile时期报错。它private继承一个Uncopyable基类,基类中的对象拷贝函数在private内声明并不作实现。private继承的作用是让派生类无法访问该对象拷贝函数。

class Uncopyable
{
protected:
	Uncopyable(){}
	~Uncopyable(){}
private:
	Uncopyable(const Uncopyable &rhs);
	Uncopyable& operator=(const Uncopyable &rhs);
};

template<typename T>
class Dog : private Uncopyable
{
	string name;
	T value;
public:
	
	Dog(const string &s, const int &v):name(s), value(v){}
private:
	//Dog(const Dog<T> &rhs);
	//Dog& operator=(const Dog<T> &rhs);
};

这两种实现功能有点类似设计模式中的单例模式,但单例模式是通过public接口函数返回成员对象的指针。

你可能感兴趣的:(设计模式,C++,String,Class)