CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

一道很经典的C++面试题,希望大虾进行指点。

楼主ice(冰雪)2006-03-17 11:40:14 在 C/C++ / C++ 语言 提问

希望大虾能指教,对路过的朋友也希望有所帮助,呵呵!  
   
  创建4个类,上帝,动物,狗,猪。其中上帝只有一个,只有上帝才能创建动物,动物能跑,狗会叫,猪会吃。   谢谢了 问题点数:80、回复次数:73Top

1 楼pomelowu(羽战士)回复于 2006-03-17 12:05:50 得分 30

呵呵~  
  enum   animal  
  {  
  DOG,  
  PIG  
  }  
   
  class   Animal  
  {  
  virtual   void   run()   {   cout   <<   "run\n";   }  
  virtual   void   do_special()   =   0;  
  };  
   
  class   Dog   :   public   Animal  
  {  
  virtual   void   do_special()   {   do_bark();   }  
  virtual   void   do_bark()   {   cout   <<   "bark\n";   }  
  };  
   
  class   Pig   :   public   Animal  
  {  
  virtual   void   do_special()   {   do_eat();   }  
  virtual   void   do_eat()   {   cout   <<   "eat\n";   }  
  };  
   
  class   God  
  {  
  public:  
  Animal   *   CreateAnimal(animal   type)  
  {  
  Animal   *pAnimal   =   NULL;  
  switch   (type)  
  {  
  case   DOG:  
  pAnimal   =   new   Dog;  
  cout   <<   "God   Created   Dog\n";  
  break;  
   
  case   PIG:  
  pAnimal   =   new   Pig;  
  cout   <<   "God   Created   Pig\n";  
  break;  
  }  
  }  
   
  void   KillAnimal(Animal   *pAnimal)  
  {  
  if   (pAnimal)  
  {  
  delete   pAnimal;  
  pAnimal   =   NULL;  
  }  
  }  
  };Top

2 楼newcore(to be or not to be, it's a question.)回复于 2006-03-17 12:11:47 得分 0

小拍一下...     :)    
   
  1、上帝只有一个  
  2、又见swith...case...  
   
   
  Top

3 楼JonneyR(lxc)回复于 2006-03-17 12:18:51 得分 0

顶Top

4 楼wawaku(一堆裤衩!)回复于 2006-03-17 12:20:14 得分 0

上帝也太不仁慈了,好不容易创建了动物,怎么还能杀呢  
  因违背《中华人民共和国野生动物保护法》,故去掉KillAnimal()方法.Top

5 楼LongLongAgoImBoy(ThereIsAMe)回复于 2006-03-17 12:59:54 得分 0

Animal   *   CreateAnimal(animal   type)  
  上帝用此方法创建动物的结果是这个动物将不知道躲到哪里去了,因为上帝把牵这个动物的绳子丢了。而且上帝肯定能有好几个,看来天庭要不太平了。Top

6 楼ydfivy(我就是一送外卖的)回复于 2006-03-17 13:03:33 得分 0

感觉考的是设计模式.  
  SingleTon模式和类工厂Top

7 楼billy145533($_$)回复于 2006-03-17 13:09:15 得分 0

markTop

8 楼orbit(走了走了)回复于 2006-03-17 13:10:58 得分 0

上帝使用单实例模式,创建动物用builder模式就行了,比工厂模式简单Top

9 楼xiao_fang(frank)回复于 2006-03-17 13:11:18 得分 0

好题目,果然精典!  
   
  pomelowu(羽战士)还没看清楚题吧:)Top

10 楼pomelowu(羽战士)回复于 2006-03-17 13:25:13 得分 0

嗯。。。习惯性省题漏条件。。。上帝只有一个:  
   
  class   God  
  {  
  public:  
  static   God   *   Instance(){   static   _GodInstance;   return   &_GodInstance;   }  
   
  public:  
  Animal   *   CreateAnimal(animal   type)  
  {  
  Animal   *pAnimal   =   NULL;  
  switch   (type)  
  {  
  case   DOG:  
  pAnimal   =   new   Dog;  
  cout   <<   "God   Created   Dog\n";  
  break;  
   
  case   PIG:  
  pAnimal   =   new   Pig;  
  cout   <<   "God   Created   Pig\n";  
  break;  
  }  
  }  
   
  void   KillAnimal(Animal   *pAnimal)  
  {  
  if   (pAnimal)  
  {  
  delete   pAnimal;  
  pAnimal   =   NULL;  
  }  
  }  
   
  protected:  
  God()   {   }  
  };  
   
  =============================  
   
  switch...case...  
   
  有什么说法么?Top

11 楼pomelowu(羽战士)回复于 2006-03-17 13:32:40 得分 0

其实也就是设计模式。用Singleton应该没什么疑问,至于用类厂。。呵呵,正在学习用COM呢。Top

12 楼xiao_fang(frank)回复于 2006-03-17 14:21:06 得分 0

“。。。只有上帝才能创建动物。。。”  
  ——题目并没有要求上帝KillAnimal,呵呵。。  
  ——“只有”上帝才能。。。如果保证呢?现在是人人都可以创建动物:  
  Dog   adog   =   new   Dog();Top

13 楼bestmai(绯村剑心)回复于 2006-03-17 15:07:51 得分 0

animal构造函数private,   friend   class   God  
  至于switch   case,其实可以避免的,将创建动物的函数抽出来,如  
  animal*   CreateCat();  
  animal*   CreateDog();  
  然后,建一个animal_type和对应创建动物函数的函数指针的map就行了,创建时直接从map中找animal_type,调用对应的函数,这样做扩展就方便多了,扩展时也不用修改God的代码  
  Top

14 楼zwl327(疾劲野风)回复于 2006-03-17 15:26:38 得分 0

MarkTop

15 楼pomelowu(羽战士)回复于 2006-03-17 15:32:04 得分 0

将创建动物的函数抽出来,如  
  animal*   CreateCat();  
  animal*   CreateDog();  
  然后,建一个animal_type和对应创建动物函数的函数指针的map就行了,创建时直接从map中找animal_type,调用对应的函数,这样做扩展就方便多了,扩展时也不用修改God的代码  
  _____________________  
   
  抽象工厂模式最原始的实现吧。其实我一直觉得,反正都要修改这个map,就是看这个map放的位置在哪里而已,而且减少了animal*   CreateCat();这种开销。所以在类比较少的时候更喜欢用一个switch...case...  
   
  =====================  
   
  ——题目并没有要求上帝KillAnimal,呵呵。。  
  _____________________  
   
  上帝是万能的。。。^_^  
   
  =====================  
   
  ——“只有”上帝才能。。。如果保证呢?现在是人人都可以创建动物:  
  _____________________  
   
  寒个~又没仔细看。。。把Dog和Pig的构造函数声明为protected,然后申明friend   class   God——这下狗妈妈都要让上帝下小狗了。。。  
   
  对了,还有些错误。。。我只是写,没有编译。。。  
  1、静态实例的声明漏了类名。  
  static   God   *   Instance(){   static   God   _GodInstance;   return   &_GodInstance;   }  
  2、CreateAnimal没有返回值  
  return   pAnimal;  
   
  =.=好累。。。不知道还有错误没。。。大家继续拍~Top

16 楼pomelowu(羽战士)回复于 2006-03-17 15:36:38 得分 0

又,animal构造函数private,   friend   class   God  
  这不行的吧?构造函数比不得其他,无法虚拟的吧。。。难道我记错了?Top

17 楼zwl327(疾劲野风)回复于 2006-03-17 15:42:25 得分 0

又,animal构造函数private,   friend   class   God  
  这不行的吧?构造函数比不得其他,无法虚拟的吧。。。难道我记错了?  
   
   
  继续拍:  
  private是私有,不是虚拟.Top

18 楼xx_jj()回复于 2006-03-17 16:54:34 得分 0

好东西   学习了Top

19 楼fisker0303(天塌了,地陷了,小花狗不见了.)回复于 2006-03-17 17:01:11 得分 0

羽战士,牛!Top

20 楼cocopww(春天我把老婆种下去,秋天我就有好多好多老婆啦)回复于 2006-03-17 17:06:59 得分 0

markTop

21 楼zwl327(疾劲野风)回复于 2006-03-17 17:30:44 得分 0

这道题太经典了,一道题考了类相关的很多方面的知识..Top

22 楼LongLongAgoImBoy(ThereIsAMe)回复于 2006-03-17 17:30:59 得分 0

又见小羽,哈哈Top

23 楼Atomictry(天影)回复于 2006-03-17 18:23:03 得分 20

1.   先建单件模式模板  
  template<class   T>  
  class   CSingleton   {  
  private:  
          static   std::auto_ptr   <   T   >   m_pInstance;  
  protected:  
          CSingleton()         {}  
          ~CSingleton()       {}  
  public:  
          static   T*   getInstance()  
          {  
                  if   (!m_pInstance.get())   //   应该加锁后再判断,否则不是线程安全的,此处忽略了。  
                  {  
                          m_pInstance   =   std::auto_ptr   <   T   >(new   T());  
                  }  
                  return   m_pInstance.get();  
          }  
  };  
  template<class   T>   std::auto_ptr   <   T   >   CSingleton<   T   >::m_pInstance;  
   
  2.   这里可以用工厂方法模式,因为有可能因为又要创建植物等类,先建立抽象工厂  
  /**************   Abstract   Factory   **************/  
  #include   <vector>  
  #include   <algorithm>  
  using   namespace   std;  
  typedef   vector   <   CAbstractAnimal   *   >   AnimalQueue;  
  #define   DELETEIF(p)   \  
          if   (p)   {                 \  
          delete   p;       \  
          p   =   NULL;       \  
          }  
   
  class   CAbstractFactory  
  {  
  public:  
          CAbstractFactory()   {}  
          //   删除所有创建的动物对象  
          virtual   ~CAbstractFactory()                                   {   for_each(m_AnimalQueues.begin(),   m_AnimalQueues.end(),   DeleteIt);   }  
          virtual   void   CreateAnimal()                                   =   0;  
   
  private:  
          static   void   DeleteIt(CAbstractAnimal   *pAnimal)     {   DELETEIF(pAnimal);   }  
   
  public:  
          AnimalQueue   m_AnimalQueues;   //   由一个vector维护动物列表  
  };  
   
  3.   实现所有动物的抽象类,用来抽取出它们共性  
  /*************   Abstract   Product   ***************/  
  class   CAbstractAnimal  
  {  
  public:  
          CAbstractAnimal()                                                       {}  
          virtual   ~CAbstractAnimal()                                     {}  
          //virtual   void   Sleep()                                                 =   0;     //   共性:   都需要睡眠  
  };  
   
  4.   实现具体的动物类:  
  /*****************   ProductA   *******************/  
  class   CDog   :   public   CAbstractAnimal  
  {  
  public:  
          CDog()                                                                             {}  
          virtual   ~CDog()                                                           {}  
          //virtual   void   Sleep()                                                 {   TRACE("Dog   sleep...\n");   }  
          virtual   void   Bark()                                                   {   TRACE("Dog   bark\n");   }  
  };  
   
  /*****************   ProductB   *******************/  
  class   CPig   :   public   CAbstractAnimal  
  {  
  public:  
          CPig()                                                                             {}  
          virtual   ~CPig()                                                           {}  
          //virtual   void   Sleep()                                                 {   TRACE("Pig   sleep...\n");   }  
          virtual   void   Eat()                                                     {   TRACE("Pig   eat...\n");   }  
  };  
   
  5.   实现具体工厂类,这样就不会有switch...case...了吧  
  /*************   Concrete   Factory   ***************/  
  class   God   :   public   CAbstractFactory,   public   CSingleton<God>  
  {  
  public:  
          God()   {}  
          virtual   ~God()   {}  
   
  //   Operate  
  public:  
          virtual   void   CreateAnimal()                                   {  
                  m_AnimalQueues.push_back(new   CDog);  
                  m_AnimalQueues.push_back(new   CPig);  
          }  
  };  
   
  6.   调用方法,即实例化God  
          God::getInstance()->CreateAnimal();  
   
  //   所有的代码将在我的blog给出。Top

24 楼Atomictry(天影)回复于 2006-03-17 18:28:17 得分 0

大家拍砖砖~~~Top

25 楼Stefine(CSDN最菜滴猩猩)回复于 2006-03-17 19:28:57 得分 0

学习后  
  帮顶Top

26 楼yinqing_yx(淘汰引擎)(玩虚一族)回复于 2006-03-17 19:58:27 得分 0

学了不少~!Top

27 楼rainfall007(夏天的雨)回复于 2006-03-17 23:03:51 得分 0

markTop

28 楼debehe(躯壳)回复于 2006-03-17 23:57:11 得分 0

学习。。Top

29 楼candy0789()回复于 2006-03-18 02:28:58 得分 0

MARKTop

30 楼wuyazhe(wyz&xyl)回复于 2006-03-18 09:09:27 得分 0

路过。路过。Top

31 楼wegotnothingtolosebu(t this is a dirty joke...)回复于 2006-03-18 09:31:51 得分 0

markTop

32 楼tudou614(魔蟹座的SATAN)回复于 2006-03-18 09:36:34 得分 0

UPTop

33 楼zhenbe(一头栽在C里面)回复于 2006-03-18 12:43:53 得分 0

我来发表一下意见,代码就不写了。  
  1、动物创建应该是动作自己的事情,怎么创建(实现)应该在相应的动物类里面,在动物基类作一个纯虚函数CreateMe(),函数的执行权在上帝手上。  
  2、如果新物种的出现,羽战士和天影的代码都得修改,上帝也没有办法。这一点,我觉得在动物的基类上应该有向上帝注册自己的功能,就是说有了新物种必须向上帝汇报,要不新物种也不能创造出来,汇报后上帝就可以创造了,上帝不需要维护一对列表。  
  3、不过这样好像有点畸形,不是上帝创造,变成动物申请创造了,呵呵。  
  3、其实羽战士和天影的代码写的够好的了,我只是看到这里兴趣所致,手有点痒,希望能够抛砖引玉。Top

34 楼Atomictry(天影)回复于 2006-03-18 13:33:52 得分 0

zhenbe(一头栽在C里面)讲的应该是观察者模式。  
   
   
  更正一下,我写的那个,CAbstractFactory应该才是上帝;God类不应该取名为God,可能取名为CAnimalFactory更合适,它相当于属于上帝家中众多小作坊中的一个,它是产生动物的小作坊。Top

35 楼jjiaming(阿熊)回复于 2006-03-18 21:48:05 得分 0

拜读各位大哥的回贴,小弟深感佩服,小弟是自学软件,头一次见到这么多的新名词,比如工厂模式、builder模式......弱弱的问一句:这些设计模式是属于软件工程的哪个范畴,同时有哪些经典的书藉对这些设计模式有介绍啊Top

36 楼Chulangzi(楚浪子-我要变强!)回复于 2006-03-18 22:49:46 得分 0

是啊,同有楼上的疑问。  
   
  顶,学习Top

37 楼zxx110(新)回复于 2006-03-19 12:12:20 得分 0

MARKTop

38 楼bjstcm(快毕业了~~~)回复于 2006-03-19 13:10:30 得分 0

markTop

39 楼colcn88((散花)只想让家里人过得更好)回复于 2006-03-19 13:51:39 得分 0

=Top

40 楼MagicCarmack(MagiC++)回复于 2006-03-19 14:37:03 得分 0

设计模式:可重用软件基础Top

41 楼robinseeyou(浪G天涯)回复于 2006-03-19 21:03:34 得分 0

迷茫。。Top

42 楼guyanhun(老婆说的都是对的!努力做个好老公!)回复于 2006-03-19 22:10:58 得分 5

呵呵,有意思   !       设计模式加上一些设计的技巧...  
  1)创建4个类,上帝   (God   ),动物(Animal   ),狗(Dog   ),猪(Pig   )。  
  2)其中上帝只有一个,         上帝使用单态模式  
  3)只有上帝才能创建动物,         Animal   有个Create   接口是privete   的,同时声明  
            friend   class   God   。这样外界就不能访问他了,God   就能。  
  4)Animal   作为基类是抽象类   ,Dog   和Pig   公有继承自Animal   。  
  5)动物能跑,     Animal   加一个run   的接口   。  
  6)狗会叫,     Dog   有一个   bark   接口。  
  7)猪会吃。     Pig   有一个   eat   接口   。  
  8)   其他动物就不会叫和吃了   ?   所以,继续完善:  
        给Animal   加一个   bark   接口,是virtual   function   。函数体里可以什么也不做,  
        Dog   中的bark   做他该做的事,Pig   可以不管。其实也就是Animal   的什么也不做了。  
        同样,eat   接口类似。  
   
  暂时就是想到这么多了。Top

43 楼guyanhun(老婆说的都是对的!努力做个好老公!)回复于 2006-03-19 22:23:16 得分 0

 
  又,animal构造函数private,   friend   class   God  
  这不行的吧?构造函数比不得其他,无法虚拟的吧。。。难道我记错了?  
   
  继续拍:  
  private是私有,不是虚拟.  
   
  -------------------------------  
  构造函数当然可以是private   的了。    
  当你不允许构造出栈对象的时候就是个例子。  
  还有你的单态的那个例子,不也是这样的吗?  
  把构造函数和拷贝构造函数都声明为private   的,再用    
  static   God   *   Instance(){   static   God   _GodInstance;   return   &_GodInstance;   }  
  函数中定义一个局部static   的God   。Top

44 楼forverlove()回复于 2006-03-19 22:48:44 得分 0

更迷茫Top

45 楼Atomictry(天影)回复于 2006-03-20 08:50:57 得分 0

以前针对23种设计模式,我每个几乎写了两个例子,近期我整理一下。  
  到时我开帖,想要的留下邮箱。Top

46 楼Atomictry(天影)回复于 2006-03-20 08:53:23 得分 0

我靠,怎么转到c++板块了,这块地盘很少来走动。:(Top

47 楼jeffchen(Jeff)回复于 2006-03-23 11:17:22 得分 10

我说一下动物的创建方法,其他的和楼上各位的意见一致。  
  因为C++不具备C#、JAVA甚至是MFC等强大的RTTI功能,没有CreateInstance、CreateObject这些类自身生成类实例的方法。同时,如果使用switch语句的话,灵活性稍差。每增加一个动物子类都要增加相应的创建语句。  
  我的方法是使用模板,配合接口完成动物创建过程。设计如下:  
   
  //   增加一个“上帝之手”的接口,用于定义创建动物的接口。  
  //   上帝使用该接口创建动物。  
  class   IHandOfGod  
  {  
  friend   class   CGod;  
  private:  
  //创建动物,只能由上帝调用  
  virtual   CAnimal*   CreateAnimal()   =0;  
  };  
   
  //   IHandOfGod创建接口的模板  
  template<class   Animal>  
  class   THandOfGod   :   public   IHandOfGod  
  {  
  private:  
  virtual   Animal*   CreateAnimal()  
  {  
  return   new   Animal;  
  }  
  };  
   
  //   上帝  
  class   CGod  
  {  
  public:  
  CGod(void)  
  {  
  };  
  public:  
  virtual   ~CGod(void)  
  {  
  };  
   
  public:  
  //   使用创建接口,创建动物  
  CAnimal*   CreateAnimal(IHandOfGod&   hand)  
  {  
  return   dynamic_cast<CAnimal*>(hand.CreateAnimal());  
  }  
  };  
   
  下面是动物的设计  
   
  class   CAnimal  
  {  
  public:  
  CAnimal()  
  {  
   
  }  
   
  public:  
  virtual   ~CAnimal(void)  
  {  
   
  }  
   
  public:  
  virtual   const   char*   ToString()   =0;  
  };  
   
  //   只能由THandOfGod<CDog>创建模板创建该类。  
  class   CDog:   public   CAnimal  
  {  
  friend   THandOfGod<CDog>;   //   声明具体的创建模板是友元  
  protected:  
  CDog()  
  {  
   
  }  
   
  public:  
  virtual   ~CDog(void)  
  {  
   
  }  
   
  public:  
  virtual   const   char*   ToString()  
  {  
  return   "Dog";  
  }  
  };  
   
  例子:  
  int   main()  
  {  
  CGod   god;  
   
  //   定义“狗”的创建模板实例  
  THandOfGod<CDog>   hand;  
   
  //   使用“狗”的创建模板实例创建  
  CAnimal*   lpAnimal=god.CreateAnimal(hand);  
   
  printf("%s\n",lpAnimal->ToString());  
   
  delete   lpAnimal;  
   
  return   0;  
  }  
   
  这样就能满足只能由上帝创建动物,又能获得创建过程的灵活性。当增加新的动物子类时,声明创建模板,并使用即可,无须修改相关的创建代码。  
   
  Top

48 楼Helloooooo(每天,我都新的)回复于 2006-03-23 13:13:49 得分 0

这个题有创意Top

49 楼gjianpro(#ifndef _DEBUG)回复于 2006-03-23 13:27:36 得分 0

design   patternsTop

50 楼shenmea00000(学习中~~~)回复于 2006-03-23 13:42:26 得分 0

真不错,很有收获~~~~~  
  谢谢楼主,谢谢各位啦,呵呵~~~~Top

51 楼yiyo2025(HenryKong)回复于 2006-03-23 13:47:00 得分 10

//动物  
  class   Animal  
  {  
  public:  
  virtual   void   Run()   =   0;  
  };  
   
  //猪  
  class   Pig   :   public   Animal  
  {  
  public:  
  void   Run();  
  void   Eat();  
  };  
   
  //狗  
  class   Dog   :   public   Animal  
  {  
  public:  
  void   Run();  
  void   Call();  
  };  
   
  //上帝,使用Singleton模式  
  class   God  
  {  
  private:  
  static   God   *s_god;  
   
  public:  
  static   God   *GetGod()  
  {  
  if   (s_god   ==   NULL)  
  {  
  s_god   =   new   God;  
  }  
  return   s_god;  
  }  
   
  Animal   *CreatePig()  
  {  
  return   new   Pig;  
  }  
   
  Animal   *CreateDog()  
  {  
  return   new   Dog;  
  }  
  };  
  God   *God::s_god   =   NULL;  
   
  Top

52 楼pomelowu(羽战士)回复于 2006-03-23 15:35:46 得分 0

又,animal构造函数private,   friend   class   God  
  这不行的吧?构造函数比不得其他,无法虚拟的吧。。。难道我记错了?  
   
  继续拍:  
  private是私有,不是虚拟.  
   
  -------------------------------  
  构造函数当然可以是private   的了。    
  当你不允许构造出栈对象的时候就是个例子。  
  还有你的单态的那个例子,不也是这样的吗?  
  把构造函数和拷贝构造函数都声明为private   的,再用    
  static   God   *   Instance(){   static   God   _GodInstance;   return   &_GodInstance;   }  
  函数中定义一个局部static   的God   。  
   
   
  ==========================  
   
  你们二位误会我的问题了。不过也是该拍的。像我一开始的代码,如果基类的构造函数为private,子类的构造函数也就private了。只不过如果基类的构造函数为protected。。。呵呵~我以为private和protected的效果一样。。。Top

53 楼xhbpla(沧浪之水)回复于 2006-03-23 16:09:47 得分 0

学习……Top

54 楼AmethystFeather(紫羽)回复于 2006-03-23 18:28:45 得分 0

新学者,我虽然对写代码还不行,但我想,"God"应该能为每个他创建的动物命名吧,不应该局限在猫猫狗狗里面..............是不是太深了?能实现吗?Top

55 楼fmilyfte(寂寞的帽子)回复于 2006-03-23 22:05:33 得分 0

刚学了类  
  想认真看一下  
  不过没时间了  
  呵呵  
  顶一下  
  不回复的孩子不是好孩子  
  Top

56 楼fmilyfte(寂寞的帽子)回复于 2006-03-23 22:11:35 得分 0

顺便  
  有谁懂黑吗  
  我很想做HACKER  
  只是没高人指导  
  现在还是白坯  
  喜欢挑战的高手朋友可以联络一下  
  QQ   357403866  
  谢谢Top

57 楼hacker813com(血色忧郁)回复于 2006-03-23 23:31:03 得分 0

markTop

58 楼SEUU(三枝花)回复于 2006-03-23 23:36:16 得分 0

太长啦,捞分吧.  
   
  还有,你的分多给我一点吧,我是来得分的,我只要星星!Top

59 楼lcb2008(安徽の刀)回复于 2006-03-24 00:13:29 得分 5

新近学习C++,看了楼上各位大虾的发言,收获不小。  
  偶也来胡乱涂鸦一番,敬请高手指正!  
   
  #include   <iostream>  
   
  using   namespace   std;  
   
  class   Animal;  
  class   God;  
   
  class   BaseHelper  
  {  
  friend   God;  
  private:  
  virtual   Animal   *   CreateInstance()   =   0;  
  };  
   
  template   <class   T>  
  class   GodHelper   :   public   BaseHelper  
  {  
  private:  
  virtual   T   *   CreateInstance()   {  
  return   new   T();  
  }  
  };  
   
  class   God  
  {  
  public:  
  static   God   *   Instance()   {    
  if   (   !m_god   )  
  m_god   =   new   God();  
  return   m_god;  
  }  
  Animal   *   CreateAnimal(   BaseHelper&   helper   )   {  
  return   helper.CreateInstance();  
  }  
  private:  
  God()   {}  
   
  static   God   *m_god;  
  };  
  God   *   God::m_god   =   NULL;  
   
  class   Animal  
  {  
  public:  
  virtual   ~Animal()   {}  
  virtual   void   Run()   =   0;  
  virtual   void   Eat()   =   0;  
  virtual   void   Bark()   =   0;  
  protected:  
  Animal()   {}  
  };  
   
  class   Dog   :   public   Animal  
  {  
  friend   GodHelper<Dog>;  
  public:  
  virtual   ~Dog()   {}  
  virtual   void   Bark()   {   cout   <<   "Dog   bark\n";   }  
  virtual   void   Eat()   {   cout   <<   "Dog   eat\n";   }  
  virtual   void   Run()   {   cout   <<   "Dog   run\n";   }  
  protected:  
  Dog()   {}  
  };  
   
  class   Pig   :   public   Animal  
  {  
  friend   GodHelper<Pig>;  
  public:  
  virtual   ~Pig()   {}  
  virtual   void   Bark()   {   cout   <<   "Pig   bark\n";   }  
  virtual   void   Eat()   {   cout   <<   "Pig   eat\n";   }  
  virtual   void   Run()   {   cout   <<   "Pig   run\n";   }  
  protected:  
  Pig()   {}  
  };  
   
  int   main()  
  {  
  God   *god   =   God::Instance();  
  Animal   *dog   =   god->CreateAnimal(GodHelper<Dog>());  
  dog->Run();  
  dog->Bark();  
  dog->Eat();  
   
  Animal   *pig   =   god->CreateAnimal(GodHelper<Pig>());  
  pig->Run();  
  pig->Bark();  
  pig->Eat();  
  system("pause");  
  delete   god;  
  }Top

60 楼lcb2008(安徽の刀)回复于 2006-03-24 00:16:20 得分 0

汗,最后漏了两句:  
  delete   dog;  
  delete   pig;Top

61 楼kokcc()回复于 2006-03-24 01:05:07 得分 0

汗...Top

62 楼Atomictry(天影)回复于 2006-03-24 08:46:17 得分 0

如果大家对设计模式有兴趣,我觉得对于入门基础知识,在网上多看看别人关于设计模式的介绍就可以了。  
   
  等觉得自己有点思想的时候,看看源代码,www.codeproject.com中就有,经常去溜溜很有帮助。  
   
  等到想系统了解的时候,就非滴看那几个牛比人写的设计模式的书了。  
   
  希望对大家有帮助。Top

63 楼jiayi613(逆天)回复于 2006-03-24 09:04:14 得分 0

up,有这么多大侠指点,多学多学。谢了谢了Top

64 楼fdimim(猿莫求愚√))回复于 2006-03-24 10:02:19 得分 0

markTop

65 楼abblly(西边日出东边雨)回复于 2006-03-24 10:24:10 得分 0

刚看起来好像很简单,看了大家的回帖才知道挺多值得学习的地方,mark一下,有时间再仔细看。Top

66 楼hansin(将冰山劈开)回复于 2006-03-24 10:35:41 得分 0

怎么不见带星的总结一下啊。。Top

67 楼september___29()回复于 2006-03-24 10:42:36 得分 0

设计模式的问题Top

68 楼KDE(黎明)回复于 2006-03-24 10:57:21 得分 0

 
      如果我的思路没有错误的话,应该是这样:  
   
        1、上帝是个Singlton,且是个Animal的Factory。  
   
        2、Animal是Dog和Pig的抽象接口父类。  
   
        3、Dog和Pig是Animal派生类,并且constructor是私有的,但对于上帝这个Factory是  
              friend。  
   
        4、Animal只实现“跑”。而Dog和Pig个自从Animal派生并实现“叫”或“吃”。  
   
        结果,就是上帝只有1个,并且只有上帝可以制造动物(包括狗和猪),狗可以“跑”和“叫”,猪可以“跑”和“吃”。Top

69 楼S_G_D(紫色)回复于 2006-03-24 11:05:46 得分 0

I   think   the   very   point   is   that   only   the   god   can   creat   animals,so   we   should   notice   the   animal's   structure   and   destroy   functions   in   "protected".  
   
  There   is   a   song   I   liked   that   named   "God   is   a   girl",so   I   think   that   god   couldn't   likes   killing.  
   
  That's   all.Top

70 楼Jchangcheng(长城)回复于 2006-03-24 15:47:09 得分 0

这怎么像是见过.  
  在中山大学的视频教程中有点其中的东西.Top

71 楼aya331(菜菜小鸟)回复于 2006-03-25 16:02:03 得分 0

但是除了God可以创造DOG、PIG,那么别人怎么使用这些动物呢?这些动物的实例有是什么呢?Top

72 楼wofish2()回复于 2006-03-31 14:39:22 得分 0

mark  
  Top

73 楼cdef9108()回复于 2006-05-09 23:05:11 得分 0

学习,还要继续学习Top

相关问题

  • c++面试题
  • 面试题(C语言基础问题),请大家指点,在线等待
  • 一道面试题,请指点
  • 马上要去面试了,做ASP.net+c#。大家指点一下!
  • 100分求C#面试题!
  • 面试题目 VC(c++)
  • 求助:c++面试题
  • 一道面试题(c)
  • C# 面试问题讨论
  • 求各种 C/C++ 面试题目

关键词

  • c++
  • 函数
  • 接口
  • virtual
  • 设计模式
  • 模板
  • god
  • 创建
  • 上帝
  • 动物

得分解答快速导航

  • 帖主:ice
  • pomelowu
  • Atomictry
  • guyanhun
  • jeffchen
  • yiyo2025
  • lcb2008

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo