#include <iostream>
#include <cassert>
using namespace std;
template <
typename T>
class scoped_ptr
{
public:
typedef T elememnt_type;
explicit scoped_ptr(T* p =
0) :px(p){
cout <<
"scoped_ptr construct" << endl; };
~scoped_ptr(){
cout <<
"scoped_ptr deconstruct" << endl;
delete px; }
T&
operator*()
const
{
assert(px !=
0);
return *px;
}
T*
operator->()
const
{
assert(px !=
0);
return px;
}
T* get()
const
{
return px;
}
void swap(scoped_ptr& p)
{
T* temp = p.px;
p.px = px;
px = temp;
}
void reset(T* p =
0){
assert(p ==
0 || p != px);
scoped_ptr<T>(p).swap(*
this);
}
operator bool()
{
cout <<
"scoped_ptr operator bool()" << endl;
return px !=
0;
}
bool operator!()
{
cout <<
"scoped_ptr bool operator!()" << endl;
return px ==
0;
}
private:
T* px;
scoped_ptr(
const scoped_ptr& ptr);
scoped_ptr&
operator=(
const scoped_ptr& ptr);
bool operator==(
const scoped_ptr& ptr);
bool operator!=(
const scoped_ptr& ptr);
};
int main(){
scoped_ptr<
int> p(
new int(
10));
if (p)
{
cout <<
"p true" << endl;
}
else
{
cout <<
"p false"<<endl;
}
scoped_ptr<
int> p2(
new int(
20));
p2.swap(p);
cout << *p << ends << *p2 << endl;
p2.reset(
new int(
100));
cout << *p << ends << *p2 << endl;
return 0;
}