| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1045 人关注过本帖
标题:类中用operator<<( )方法在输出有new动态分配的类时就造成程序的终止运行问 ...
只看楼主 加入收藏
沿途有鬼
Rank: 1
等 级:新手上路
帖 子:68
专家分:0
注 册:2008-7-20
收藏
 问题点数:0 回复次数:4 
类中用operator<<( )方法在输出有new动态分配的类时就造成程序的终止运行问题?
//头文件
#ifndef COW_H_
#define COW_H_
#include<iostream>
using std::ostream;
using std::istream;

class Cow
{
    char name[20];
    char * hobby;
    double weight;
    int len;
public:
    Cow();
    Cow(const char * nm,const char * ho,double wt);
    Cow(const Cow & c);
    ~Cow();
    Cow & operator=(const Cow & c);
    //Cow & operator=(const char * c);
    void ShowCow()const;
    friend ostream & operator<<(ostream & os,const Cow t);
};

#endif

//源文件
#include<iostream>
#include"cow.h"


Cow::Cow()
{
    hobby=new char[1];
    hobby[0]='\0';
        
strcpy(name,"no name");
    weight=0;

}
Cow::Cow(const char * nm,const char * ho,double wt)
{
strncpy(name,nm,20);
    name[20]='\0';
    len=strlen(ho);
    hobby=new char[len+1];
    strcpy(hobby,ho);
    weight=wt;
}

Cow::Cow(const Cow & c)
{
    strcpy(name,c.name);
    len=c.len;
    hobby=new char[len+1];
    strcpy(hobby,c.hobby);
    weight=c.weight;
}
Cow::~Cow()
{
    delete [] hobby;
}
Cow & Cow::operator=(const Cow & c)
{
    if(this==&c)
        return *this;
    delete [] hobby;
    len=c.len;
    hobby=new char[len+1];
    strcpy(name,c.name);
    strcpy(hobby,c.hobby);
    weight=c.weight;
    return *this;
}

void Cow::ShowCow()const
{
    using std::cout;
    using std::endl;
    cout<<"Name is: "<<name<<" ,hobby is: "<<hobby<<" ,weight is: "<<weight<<endl;
}

ostream & operator<<(ostream & os,const Cow t)
{
    using std::cout;
    using std::endl;
    cout<<"Name is: "<<t.name<<" ,hobby is: "<<t.hobby<<" ,weight is: "<<t.weight<<endl;
        return os;
}

//mian()
#include<iostream>
#include"cow.h"

int main()
{
    using std::cout;
    Cow nu1("xiaoxiaoqiang","baoyuan",50);
    Cow nu2;
    Cow temp;
//    nu1.ShowCow();
    cout<<nu1;
//    nu2.ShowCow();
    cout<<nu2;
    nu2=nu1;
//    nu2.ShowCow();
    cout<<nu2;
    return 0;
}

我的问题是为什么用cout<<nu1输出会造成程序的终止,我的深度复制构造函数和析构函数都写了啊,如果我把main()改成用ShowCow输出则没有问题,请问这个是怎么回事啊,我做了好几道关于new动态分配类中字符串的题都遇到了这个问题,我很想知道到底是什么问题,大侠们帮帮我啊~!
#include<iostream>
#include"cow.h"

int main()
{
    using std::cout;
    Cow nu1("xiaoxiaoqiang","baoyuan",50);
    Cow nu2;
    Cow temp;
    nu1.ShowCow();
//    cout<<nu1;
    nu2.ShowCow();
//    cout<<nu2;
    nu2=nu1;
    nu2.ShowCow();
//    cout<<nu2;
    return 0;
}

下面是我用VC6.0创好了的工程,大家直接点击121Cow.dsw运行看看帮我找找问题,感激不尽啊~
121Cow.rar (852.27 KB)
搜索更多相关主题的帖子: operator Cow const char std 
2008-08-12 16:14
hoda
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-8-12
收藏
得分:0 
Cow & Cow::operator=(const Cow & c)
{
    if(this==&c)
        return *this;
    delete [] hobby; //这个 hobby 你也没判断它是不是空的...
    len=c.len; //这个长度你也没判断是不是小于0
    hobby=new char[len+1]; //申请完内存,没判断是否申请成功
    strcpy(name,c.name);
    strcpy(hobby,c.hobby);
    weight=c.weight;
    return *this;
}

我这用VC6把你的工程原样没动编译了一下!
发现一处错误,注释掉就没问题了

int main()
{
    using std::cout;
    Cow nu1("xiaoxiaoqiang","baoyuan",50);
    Cow nu2;
    Cow temp;
//    nu1.ShowCow();
    cout<<nu1;
//    nu2.ShowCow();
    //cout<<nu2;  //这句崩了,因为nu2里的东西没被初始化,用了空指针了
    nu2=nu1;
//    nu2.ShowCow();
    cout<<nu2;
    return 0;
}


你所说的 cout<<nu1 出现崩溃,也很有可能使用了空指针.
你的这个工程修改修改,指针不能用空的啊!你加些判断吧

cout<<"Name is: "<<t.name<<" ,hobby is: "<<t.hobby<<" ,weight is: "<<t.weight<<endl;
    
你看看,就这t.hobby也不知道它是不是空的你就用...

[[it] 本帖最后由 hoda 于 2008-8-12 21:54 编辑 [/it]]
2008-08-12 21:50
沿途有鬼
Rank: 1
等 级:新手上路
帖 子:68
专家分:0
注 册:2008-7-20
收藏
得分:0 
非常感谢啊,你能告诉我你用VC编译的时候怎么知道的是下面这句崩溃的~我现在知道我的问题了,非常谢谢你~
//cout<<nu2;  //这句崩了,因为nu2里的东西没被初始化,用了空指针了
2008-08-12 22:00
hoda
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-8-12
收藏
得分:0 
VC直接F5进行调试就行了!F10步过, F11步进
你这个直接看流程也能看出来
你这个工程用“野指针”的地方太多了
所以崩在哪里都不重要了,你申请完内存
和在使用的时候,不判断指针为空,那是
你的问题了哦!多注意些吧
2008-08-12 22:03
沿途有鬼
Rank: 1
等 级:新手上路
帖 子:68
专家分:0
注 册:2008-7-20
收藏
得分:0 
[bo][un]hoda[/un] 在 2008-8-12 22:03 的发言:[/bo]

VC直接F5进行调试就行了!F10步过, F11步进
你这个直接看流程也能看出来
你这个工程用“野指针”的地方太多了
所以崩在哪里都不重要了,你申请完内存
和在使用的时候,不判断指针为空,那是
你的问题了哦!多注 ...

我安你说的试了下,但是出现的都是些很奇怪的非C++语法代码,我怎么能把这其中的非C++语法和源文件上的语法错误的地方对应呢?我还是不知道你是怎么找出哪句死的,我很想学会啊,这对我修改程序很有帮助啊,不然我程序运行阶段一出错我就不会查原因自己就不知道怎么改程序了,谢谢各位赐教啊~!
2008-08-13 10:36
快速回复:类中用operator<<( )方法在输出有new动态分配的类时就造成程序的终止运 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029296 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved