一。要求对象必须产生于heap中
#include <iostream>
#include <memory>
using namespace std;
class Print
{
public:
void submitJob()
{
cout<<this<<":Print::submitJob()\n";
}
void reset()
{
cout<<this<<":Print::reset()\n";
}
void performSelfTest()
{
cout<<"Print::performSelfTest()\n";
}
Print()
{
cout<<"Print::Print()\n";
}
Print(const Print &rhs)
{
cout<<"Print::copy Print()\n";
}
//pseudo deconstructor
void desttoy()
{
delete this;
}
protected:
//将析构函数声明为private会影响继承和内含,所以改为protected
~Print()
{
cout<<"Print::~Print()\n";
}
private:
};
int main() {
// Print p; //it's error,because the deconstructor is private
Print *p1=new Print();
//delete p1; //this's also error,because it attempt to invoke the private deconstrutor
p1->desttoy();
}
虽然书中说也可以见所有构造函数私有,但明显没有将析构函数私有来的简单,原因:析构函数只有一个,二构造函数五花八门(包括拷贝构造函数)。
同样,将析构函数私有带来的致命问题是:妨碍了继承(inheritance)和内含(containment)。
二。禁止对象产生于heap中
#include <iostream>
#include <memory>
using namespace std;
class Print
{
public:
void submitJob()
{
cout<<this<<":Print::submitJob()\n";
}
void reset()
{
cout<<this<<":Print::reset()\n";
}
void performSelfTest()
{
cout<<"Print::performSelfTest()\n";
}
protected:
private:
static void *operator new(size_t size);
static void operator delete(void *ptr);
};
int main() {
Print p1;
static Print p2;
// Print *p3=new Print();//it's error
}