65,211
社区成员
发帖
与我相关
我的任务
分享
class Base
{
public:
virtual ~Base();
virtual printf() { std::cout << "Class Base"; }
virtual Base *clone() const { return new Base(*this); }
};
class Derived : public Base
{
public:
printf() { std::cout << "Class Derived"; }
Derived *clone() const { return new Derived(*this); }
};
class Handle
{
private:
Base *p;
std::size_t *use;
void decr_use() { if(--*use == 0) { delete p; delete use; } }
public:
Handle() : p(0), use(new std::size_t(1)) {}
Handle(const Base &b) : p(b.clone()), use(new std::size_t(1)) {}
Handle(const Handle &h) : p(h.p), use(h.use) { ++*use; }
~Handle() { decr_use(); }
Handle &operator =(const Handle &h)
{
++*h.use;
decr_use();
p = h.p;
use = h.use;
return *this;
}
const Base *operator *() const { if(p) return p; }//此处本来应该有异常处理,懒得写了,只要保证指针有确定指向就没有问题
const Base &operator ->() const { if(p) return *p; }
};
//使用
int main()
{
Base *b1 = new Base;
Base *b2 = new Derived;
Handle array[2] = {Handle(b1), Handle(b2)};
array[0]->printf();//打印Base内容
std::cout << std::endl;
array[1]->printf();//打印Derived内容
return 0;//无需delete;当然,这个用法很土
}
#include <cstdlib>
#include <iostream>
using namespace std;
class Base {
public:
virtual ~Base() {};
virtual void printf() const { std::cout << " Class Base " << std::endl; }
virtual Base* clone() const { return new Base(*this); }
};
class Derived: public Base {
public:
void printf() const { std::cout << " Class Derived " << std::endl; }
Derived* clone() const { return new Derived(*this); }
};
class Handle {
private:
Base *p;
std::size_t *count;
void gc() { if (--*count == 0) { delete p; delete count; } }
public:
Handle(): p(0), count(new std::size_t(1)) {}
Handle(const Handle &h): p(0), count(new std::size_t(1)) {}
Handle& operator=(const Handle &rhs)
{
++*count;
gc();
p = rhs.p;
count = rhs.count;
return *this;
}
~Handle() { gc(); }
Handle(const Base &b): p(b.clone()), count(new std::size_t(1)) {}
const Base& operator*() const { if(p) { return *p; } }
const Base* operator->() const { if(p) { return p; } }
};
int main(int argc, char *argv[])
{
Base *b1 = new Base;
Base *b2 = new Derived;
Handle array[2] = { Handle(*b1), Handle(*b2) };
array[0]->printf();
array[1].operator->()->printf();
system("PAUSE");
return EXIT_SUCCESS;
}