方法是:可以将对应的函数在类中进行声明,这样编译器就不会自动去生成。可行具体方案如下:
(1).将这个函数在该类中声明为private,并不进行定义。
(但当本类成员函数或者友元函数进行调用时,编译期不会出错,连接时才开始出错)
代码示例:
class HomeForSale
{
public:
...
private:
...
HomeForSale(const HomeForSale &); // 参数并非必要,这里不去实现,所以不写
HomeForSale& operator= (const HomeForSale &);
}
(2).将该函数专门用一个基类里面进行声明为private,并不进行定义。
然后进行继承,继承类不用再写该函数。(这可以保证当本类成员函数或者友元函数进行调用时,在编译期就可以发现错误)
原理概述:
如果某个基类将copying函数声明为private,编译器将拒绝为其继承类生成一个copying函数。毕竟编译器为继承类所产生的copying函数想象中可以处理基类成分,但它们当然无法调用继承类无权调用的成员函数。编译器两手一摊,无能为力。
代码示例:
class Uncopyable
{
protected:
Uncopyable(){} // 允许继承对象的构造和析构函数
~Uncopyable(){} // 析构函数不一定得是virtual
private:
Uncopyable(const Uncopyable&); // 阻止拷贝
Uncopyable& operator=(const Uncopyable&);
}
class HomeForSale : private Uncopyable // 不一定都是public 继承
{
// class 不再声明拷贝构造函数和赋值操作符
...
}
这行得通,因为只要任何人,甚至是成员函数或友元函数,尝试拷贝,编译器便试着生成一个copy构造函数和一个copy assigenment 操作符,这些函数的“编译器生产版”会尝试调用其 base class 的对应兄弟,那些调用会被编译器拒绝,因为其 base class 的拷贝函数是private