1. prohibit delete raw pointer( use protected destructor )
class A
{
public:
virtual void sing() = 0;
protected:
virtual ~A() {}
};
class B : public A
{
public:
virtual void sing()
{
std::cout <<"Do re mi fa so la";
}
};
boost::shared_ptr<A> createA()
{
boost::shared_ptr<A> p ( new B() );
return p;
}
int main()
{
boost::shared_ptr<A> test = createA()
delete test.get(); // compile error because ~A is protected
}
2. prohibit delete raw pointer( nest class)
class A
{
class deleter
{
public:
void operator() (A * p )
{
delete P;
}
};
friend class deleter;
public:
virtual void sing()
{
std::cout << "Lalalalalalalala";
}
static boost::shared_ptr<A> createA()
{
boost::shared_ptr<A> p(new A(), A::deleter() );
return p;
}
protected:
virtual ~A() {}
};