fork(1) download
  1. #include <iostream>
  2. #include <vector>
  3. using std::cout;
  4. using std::endl;
  5. using std::vector;
  6.  
  7. class BaseItem{
  8. public:
  9. virtual BaseItem* clone()
  10. {
  11. return new BaseItem(*this);
  12. }
  13. virtual void sayHello()
  14. {
  15. cout<<"Hello, I am class BaseItem!"<<endl;
  16. }
  17. virtual ~BaseItem() {}
  18. };
  19.  
  20. class ChildItem:public BaseItem{
  21. public:
  22. ChildItem* clone()
  23. {
  24. return new ChildItem(*this);
  25. }
  26. void sayHello(){
  27. cout<<"Hello, I am class ChildItem!"<<endl;
  28. }
  29. };
  30.  
  31.  
  32. template <typename T>
  33. class Handle
  34. {
  35. public:
  36. Handle():baseItem(NULL), refCount(new size_t(0)) {}
  37. Handle(T& object):baseItem(object.clone()), refCount(new size_t(1)) {}
  38.  
  39. Handle(const Handle<T>& other):baseItem(other.baseItem), refCount(other.refCount) { ++*refCount; }
  40.  
  41. Handle& operator= (const Handle<T>& other)
  42. {
  43. ++*other.refCount;
  44. dec_count();
  45. baseItem = other.baseItem;
  46. refCount = other.refCount;
  47. return *this;
  48. }
  49.  
  50. const T* operator->() const {return baseItem;};
  51. const T& operator*() const {return *baseItem;};
  52.  
  53. T* operator->() {return baseItem;};
  54. T& operator*() {return *baseItem;};
  55.  
  56. virtual ~Handle(void)
  57. {
  58. dec_count();
  59. }
  60. private:
  61. T *baseItem;
  62. std::size_t* refCount;
  63. void dec_count()
  64. {
  65. if (-- *refCount == 0 && baseItem != NULL)
  66. {
  67. delete baseItem;
  68. delete refCount;
  69. }
  70. }
  71. };
  72.  
  73. int main()
  74. {
  75. BaseItem item1;
  76. ChildItem item2;
  77.  
  78. vector<Handle<BaseItem> > vec;
  79. vec.push_back(Handle<BaseItem>(item1));
  80. vec.push_back(Handle<BaseItem>(item2));
  81.  
  82. for (vector<Handle<BaseItem> >::iterator iter = vec.begin();
  83. iter != vec.end(); iter++)
  84. {
  85. (*(*iter)).sayHello();
  86. }
  87. return 0;
  88. }
Success #stdin #stdout 0s 3476KB
stdin
Standard input is empty
stdout
Hello, I am class BaseItem!
Hello, I am class ChildItem!