CHAPTER4-22.cpp
上传用户:fjc899
上传日期:2007-07-03
资源大小:187k
文件大小:3k
源码类别:

STL

开发平台:

C/C++

  1. //文件名:CHAPTER4-22.cpp
  2. #include "stl.h"
  3. #include <string.h>
  4. #include <iostream>
  5. #include <list>
  6. using namespace std;
  7. // abstract base class
  8. class Base 
  9. {
  10. public:
  11.     const char* type_name() const { return typename_; }
  12.     virtual Base* clone() const = 0;
  13.     virtual void identify(ostream& os) const = 0;
  14.     virtual ~Base();
  15. public:
  16.     static int count;
  17. protected:
  18.     Base(const char* type_name);
  19.     Base(const Base& base);
  20. private:
  21.     char* typename_;
  22. };
  23. Base::Base(const char* type_name) 
  24. {   const char* tname = (type_name) ? type_name : "unknown";
  25.     strcpy(typename_ = new char[strlen(tname) + 1], tname);
  26.     ++count;
  27. }
  28. Base::Base(const Base& base) 
  29. {   strcpy( typename_ = new char[strlen(base.typename_) + 1], base.typename_ );
  30.     ++count;
  31. }
  32. Base::~Base() 
  33. {   delete[] typename_;
  34.     --count;
  35. }
  36. // First derived class. 
  37. class Derived1 : public Base 
  38. {public:
  39.     Derived1(int data) : Base("derived1"), data_(data) { }
  40.     Derived1(const Derived1& d) : Base("derived1"), data_(d.data()) { }
  41.     virtual ~Derived1()        { }
  42.     virtual Base* clone() const { return new Derived1(*this); }
  43.     virtual void identify(ostream& os) const;
  44.     int data() const { return data_; }
  45. private:
  46.     int data_;
  47. };
  48. void Derived1::identify(ostream& os) const { os << "(" << type_name() << " " << data() << ")"; }
  49. // Second derived class. 
  50. class Derived2 : public Base 
  51. {public:
  52.     Derived2(int data) : Base("derived2"), data_(data) { }
  53.     Derived2(const Derived2& d) : Base("derived2"), data_(d.data()) { }
  54.     virtual ~Derived2()        { }
  55.     virtual Base* clone() const { return new Derived2(*this); }
  56.     virtual void identify(ostream& os) const;
  57.     int data() const { return data_; }
  58. private:
  59.     int data_;
  60. };
  61. void Derived2::identify(ostream& os) const { os << "(" << type_name() << " " << data() << ")"; }
  62. class BaseWrapper 
  63. {public:
  64.     BaseWrapper(Base* base_ptr = 0) : base_ptr_(base_ptr) { }
  65.     BaseWrapper(const BaseWrapper& bw) { base_ptr_ = bw() ? bw()->clone() : 0; }
  66.     ~BaseWrapper() { delete base_ptr_; }
  67.     const Base* operator()()  const { return base_ptr_; }
  68.     Base* operator()()  { return base_ptr_; }
  69.     BaseWrapper& operator= (const BaseWrapper& bw){ delete base_ptr_; base_ptr_ = bw()->clone(); }
  70. private:
  71.     Base* base_ptr_;
  72. };
  73. bool operator== (const BaseWrapper& bw1, const BaseWrapper& w2) { return false; }
  74. bool operator< (const BaseWrapper& bw1, const BaseWrapper& w2) { return false; }
  75. // define static members.
  76. int Base::count = 0;
  77. int main(int, char*[]) 
  78. {
  79.     list<BaseWrapper> list1;
  80.     list1.push_back(BaseWrapper(new Derived1(101)));
  81.     list1.push_back(BaseWrapper(new Derived2(201)));
  82.     list1.push_back(BaseWrapper(new Derived2(202)));
  83.     list1.push_back(BaseWrapper(new Derived1(102)));
  84.     list1.push_back(BaseWrapper(new Derived2(203)));
  85.     list<BaseWrapper>::const_iterator it = list1.begin();
  86.     for(; it != list1.end(); ++it) { const BaseWrapper& bw = *it; bw()->identify(cerr); cerr << " ";}
  87.     cerr << endl << endl;
  88.     return 0;
  89. }