首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

希望谁能帮小弟我修正一下程序(就几行代码,但总报错)

2012-04-11 
希望哪位高手能帮我修正一下程序(就几行代码,但总报错)呵,其实我就想试一下拷贝构造函数与多态,请帮我指出

希望哪位高手能帮我修正一下程序(就几行代码,但总报错)
呵,其实我就想试一下拷贝构造函数与多态,请帮我指出错误在哪就行了,现在问题,就在拷贝那,我把代码复制上来


#include<iostream>
#include<string>
using namespace std;

class base{
public:
  base(){cout<<"构造base"<<endl;}
  virtual void create(){display();}
  virtual void display(){cout<<"display base"<<endl;}
  ~base(){cout<<"析构base"<<endl;}
};
class sub:public base{
  char* s;
public:
  sub* theApp;
  sub(char* p){
  cout<<"构造 sub->"<<p<<endl;

  s=new char(strlen(p)+1);
  if(s) strcpy(s,p);
   
  theApp=this;
  }
  

  sub(const sub& ss){
  cout<<"拷贝构造"<<endl;

  s=new char(strlen(ss.s)+1);
  if(s) strcpy(s,ss.s);
   
  theApp=this;
  }


  virtual void display(){cout<<"display sub"<<endl;}
  ~sub(){cout<<"析构sub->"<<s<<endl;delete[] s;}
};

sub* get_obj(sub obj); // 使用传值
sub objs("objs"); //全局
int main(){

  sub* q=get_obj(objs);  
  q->create();// 这没有触发析构函数,是不是因为指针对象的关系?

  sub x("x"); //想再生成个对象试一下,可是没到这 就出问题了,想也不想不通
  x.create();
}

sub* get_obj(sub obj){return obj.theApp;}

[解决办法]
不知道你什么目的,但是下面这个句子是有问题的

sub* get_obj(sub obj){return obj.theApp;}
返回的是obj的一个临时拷贝的成员变量theApp,
退出函数的时候,这个临时变量也被析构了
q所指向的东西也就不存在了,所q->create 会出错。

可以改为:
sub* get_obj(sub &obj){return obj.theApp;}
[解决办法]
new也写错了
[解决办法]
事实上,错误发生在 q->create();那里,你返回的obj的theApp的时候那个拷贝的临时变量obj被析构了,q指针所指向的对象被释放了。所以错误发生了。
而且你的new char数组大小也有问题。给你改了下

C/C++ code
class base{public:    base(){cout<<"构造base"<<endl;}    virtual void create(){display();}    virtual void display(){cout<<"display base"<<endl;}    ~base(){cout<<"析构base"<<endl;}};class sub:public base{    char* s;public:    sub* theApp;    sub(char* p){        cout<<"构造 sub->"<<p<<endl;                s=new char[10];        if(s) strcpy(s,p);                theApp=this;    }            sub(const sub& ss){        cout<<"拷贝构造"<<endl;                s=new char[10];        if(s) strcpy(s,ss.s);                theApp=ss.theApp;    }            virtual void display(){cout<<"display sub"<<endl;}    ~sub(){cout<<"析构sub->"<<s<<endl;delete[] s;}};sub* get_obj(sub obj); // 使用传值sub objs("objs"); //全局int main(){    sub* q=get_obj(objs);       q->create();// 这没有触发析构函数,是不是因为指针对象的关系?        sub x("x"); //想再生成个对象试一下,可是没到这 就出问题了,想也不想不通    x.create();    return 0;}sub* get_obj(sub obj){return obj.theApp;}
[解决办法]
new出的数组有点问题

热点排行