CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
英特尔®游戏设计大赛100美元现金周周送 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

看看这是为什么不能运行?

楼主cbenny(飞鸟)2003-05-04 11:41:32 在 C/C++ / C语言 提问

#include   <iostream>  
  #include   <string>  
  using   namespace   std;  
  class   Base  
  {  
  public:  
    virtual   void   play()const{  
  cout<<"It's   a   Base   class!"<<endl;  
  }  
  virtual   Base*   clone(){  
  Base*   ptr=new   Base;  
  *ptr=*this;  
  return   ptr;  
  }  
  virtual   ~Base(){  
  delete   ptr;  
  }  
  };  
  class   derive1   :public   Base  
  {  
  public:  
  void   play()const{  
  cout<<"It's   a   derive1   class!"<<endl;  
  }  
  derive1*   cloen(){  
  derive1   *ptr=new   derive1;  
  *ptr=*this;  
  return   ptr;  
  }  
  ~derive1(){  
  delete   ptr;  
  }  
  };  
  class   derive2   :public   Base  
  {  
  public:  
  void   play()const{  
  cout<<"It's   a   derive2   class!"<<endl;  
  }  
  derive2*   clone(){  
  derive2   *ptr=new   derive1;  
  *ptr=*this;  
  return   ptr;  
  }  
  ~derive2(){  
  delete   ptr;  
  }  
  };  
  int   main()  
  {  
  derive1   a;  
  derive2   b;  
  Base   *e=&a;  
  Base   *f=&b;  
          (e->clone())->play();  
  (f->clone())->play();  
  return   0;  
  }  
  哪位仁兄能告诉我原因 问题点数:20、回复次数:5Top

1 楼snipersu()回复于 2003-05-04 21:03:52 得分 5

#include   <iostream>  
  #include   <string>  
  using   namespace   std;  
  class   Base  
  {  
  public:  
    virtual   void   play()const{  
  cout<<"It's   a   Base   class!"<<endl;  
  }  
  virtual   Base*   clone(){  
  Base*   ptr=new   Base;  
  *ptr=*this;  
  return   ptr;  
  }  
  virtual   ~Base(){  
  //delete   ptr;  
  }  
  };  
  class   derive1   :public   Base  
  {  
  public:  
  void   play()const{  
  cout<<"It's   a   derive1   class!"<<endl;  
  }  
  Base*   cloen(){  
  derive1   *ptr=new   derive1;  
  *ptr=*this;  
  return   ptr;  
  }  
  ~derive1(){  
  // delete   ptr;  
  }  
  };  
  class   derive2   :public   Base  
  {  
  public:  
  void   play()const{  
  cout<<"It's   a   derive2   class!"<<endl;  
  }  
  Base*   clone()//  
  {  
    derive2   *ptr=new   derive2;  
  *ptr=*this;  
  return   ptr;  
  }  
  ~derive2(){  
  //delete   ptr;  
  }  
  };  
  int   main()  
  {  
  derive1   a;  
  derive2   b;  
  Base   *e=&a;  
  Base   *f=&b;  
          (e->clone())->play();  
  (f->clone())->play();  
  return   0;  
  }  
  上边这样可以通过,不过你的代码的问题很大.  
  ptr不是成员变量所以不能在析构函数中调用.  
  即使这样还存在内存泄漏.  
  建议你再看看书,在改改.  
  拙见!  
  有问题共同探讨.  
  Top

2 楼snipersu()回复于 2003-05-04 21:07:45 得分 5

还有这行*ptr=*this;  
  如果你让ptr成为类成员变量且为指针型的话,要提供拷贝构造函数和operator=(这方面建议你看看effective   c++).Top

3 楼sirouni2003(嘿嘿)回复于 2003-05-04 21:41:45 得分 5

1   你的ptr不是类的成员,所以不应该再析构汉书中delete  
  2   如果ptr不是成员,而你的类没有什么特殊的用途,你编写的clone(),没有实际的意义。如果必须写clone(),只要像上面所说的提供operaror=和拷贝构造函数就可以了。Top

4 楼njustar(abstract thinking)回复于 2003-05-05 23:03:21 得分 5

#include   "stdafx.h"  
  #include   <iostream>  
  using   namespace   std;  
  class   base  
  {  
  public:  
  base()  
  {  
  }  
  virtual   void   display()  
  {  
  cout<<"this   is   base   call"<<endl;  
  }  
  virtual     void*   myclone()  
  {  
  base*   tmp=new   base();  
  *tmp=*this;  
  return   (void*)tmp;  
  }  
  };  
  class   derive:public   base  
  {  
  public:  
    void   display()  
  {  
  cout<<"this   is   derive   call"<<endl;  
  }  
  void*   myclone()  
  {  
  derive*   tmp=new   derive;  
  *tmp=*this;  
  return   (void*)tmp;  
   
  }  
  };  
  class   derive2:public   base  
  {  
  public:  
    void   display()  
  {  
  cout<<"this   is   derive2   call"<<endl;  
  }  
  void*   myclone()  
  {  
  derive2*   tmp=new   derive2;  
  *tmp=*this;  
  return   (void*)tmp;  
   
  }  
  };  
   
  int   main(int   argc,   char*   argv[])  
  {  
  base*   a=new   derive;  
  base*   c=new   derive2;  
  a->display();  
  base*   b=(base*)a->myclone();  
  base*   d=(base*)c->myclone();  
  d->display();  
  b->display();  
  return   0;  
  }  
  Top

相关问题

  • 为什么这条javascript不能运行
  • 为什么不能运行?
  • 为什么不能运行?
  • 在这个目录下为什么不能运行java * ?
  • 为什么不能运行这个程序?
  • 为什么我的这段javascript代码不能运行啊?
  • *.idc不能运行了,请问这是为什么?谢谢
  • 为什么这个“helloworld”程序不能运行?
  • 为什么这个例子不能运行啊???
  • WSE 2.0 ***** AsymmetricEncryption **** 这个Sample我为什么不能运行??

关键词

  • 函数
  • virtual
  • 看看
  • play
  • 成员
  • clone
  • ptr
  • display
  • cout
  • using namespace std

得分解答快速导航

  • 帖主:cbenny
  • snipersu
  • snipersu
  • sirouni2003
  • njustar

相关链接

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

广告也精彩

反馈

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