鱼C论坛

 找回密码
 立即注册
查看: 1055|回复: 2

[已解决]在调用Play方法后为什么名字显示不出来?求各位大佬指点一二,小白在这里先谢过...

[复制链接]
发表于 2019-10-12 15:24:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <iostream>
#include <string>
using namespace std;
class Pet
{
public:
    Pet(string name);
    ~Pet();
    static int GetCount();
    virtual void Play() = 0; //声明为抽象方法,那么就不用在基类Pet中写具体实现了
protected:
    string name;

private:
    static int count;
};
int Pet::count = 0;
class Cat : public Pet
{
public:
    Cat(string name);
    void Play();

protected:
    string name;
};
class Mouse : public Pet
{
public:
    Mouse(string name);
    void Play();

protected:
    string name;
};
Pet::Pet(string name)
{
    this->name = name;
    count++;
    cout << "有一只宠物诞生了。。。。。。^_^!叫作:" << name << endl;
}
Pet::~Pet()
{
    count--;
    cout << "有一只叫作" << name << "的宠物挂掉了。。。。。。T_T!让人无比的心痛!!!" << endl;
}
Cat::Cat(string name) : Pet(name)
{
    ;
}
void Cat::Play()
{
    cout<<name << "在玩儿毛线球^_^" << endl;                    //我明明写名字name 了,为什么输出不到屏幕上???????????????
}
Mouse::Mouse(string name) : Pet(name)
{
    ;
}
void Mouse::Play()
{
    cout << name << "在打洞。。。。。。^_^" << endl;
}
int Pet::GetCount()
{
    return count;
}
int main()
{
    /* {
    Cat cat_1("Tom 1号");
    Mouse mouse_1("Jerry 1号");
    cout<<"已经诞生了"<<Pet::GetCount()<<"只宠物\n"<<endl;

    cat_1.Play();
    mouse_1.Play();

    Cat cat_2("Tom 2号");
    Mouse mouse_2("Jerry 2号");
    cout<<"目前为止,已经诞生了"<<Pet::GetCount()<<"只宠物\n"<<endl;
    }
    cout<<"\n现在还剩"<<Pet::GetCount()<<"只宠物!!!"<<endl; */

    Pet *cat = new Cat("Tom_3号");
    Pet *mouse = new Mouse("Jerry_3号");
    cat->Play();                 //就是这里,调用play后怎么显示不出来名字?????????????????????????上面和下面结果结果一样
    mouse->Play();
    return 0;
}

运行结果如下:
有一只宠物诞生了。。。。。。^_^!叫作:Tom_3号
有一只宠物诞生了。。。。。。^_^!叫作:Jerry_3号
在玩儿毛线球^_^                                                  //名字在哪呢???????????????????
在打洞。。。。。。^_^
最佳答案
2019-10-12 18:25:45
原因在于:Cat::Cat(string name) : Pet(name)中后半部分“: Pet(name)”是初始化列表(不是继承关系),意思是,你对Pet的name初始化成传入的string name,而“Cat(string name)”中的name是形参,从头到尾,都未对class Cat中的name进行赋值,经过调试发现其值为“NULL”。所以下面按照初始化列表的思路给你改了下:
#include <iostream>
#include <string>
using namespace std;
class Pet
{
public:
    Pet(string name);
    ~Pet();
    static int GetCount();
    virtual void Play() = 0; //声明为抽象方法,那么就不用在基类Pet中写具体实现了
protected:
    string name;
       
private:
    static int count;
};
int Pet::count = 0;
class Cat : public Pet
{
public:
    Cat(string name_c);  //注意命名
    void Play();
       
protected:
    string NAME_C;  //注意命名
};
class Mouse : public Pet
{
public:
    Mouse(string name_m);//注意命名
    void Play();
       
protected:
    string NAME_M;//注意命名
};
Pet::Pet(string name)
{
    this->name = name;
    count++;
    cout << "有一只宠物诞生了。。。。。。^_^!叫作:" << name << endl;
}
Pet::~Pet()
{
    count--;
    cout << "有一只叫作" << name << "的宠物挂掉了。。。。。。T_T!让人无比的心痛!!!" << endl;
}
Cat::Cat(string name_c) : Pet(name_c),NAME_C(name_c)  //初始化列表增加对NAME_C的初始化
{
    ;
}
void Cat::Play()
{
    cout<<NAME_C << " 在玩儿毛线球^_^" << endl;                    //注意输出的变量
}
Mouse::Mouse(string name_m) : Pet(name_m),NAME_M(name_m)   //初始化列表增加对NAME_M的初始化
{
    ;
}
void Mouse::Play()
{
    cout << NAME_M << " 在打洞。。。。。。^_^" << endl;   //注意输出的变量
}
int Pet::GetCount()
{
    return count;
}
int main()
{
    Pet *cat = new Cat("Tom_3号");
    Pet *mouse = new Mouse("Jerry_3号");
    cat->Play();                 
    mouse->Play();
    delete cat;   //删除new
    delete mouse;   //删除new
    return 0;
}

程序有两个比较大的问题:
1. 命名混乱,子类和父类的成员函数命名一样,输出到底是父类的name还是子类的name,尤其还将name定义成static,这样容易造成代码阅读不清晰;
2. new一定要跟delete配对,不配对造成内存溢出。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-12 18:25:45 | 显示全部楼层    本楼为最佳答案   
原因在于:Cat::Cat(string name) : Pet(name)中后半部分“: Pet(name)”是初始化列表(不是继承关系),意思是,你对Pet的name初始化成传入的string name,而“Cat(string name)”中的name是形参,从头到尾,都未对class Cat中的name进行赋值,经过调试发现其值为“NULL”。所以下面按照初始化列表的思路给你改了下:
#include <iostream>
#include <string>
using namespace std;
class Pet
{
public:
    Pet(string name);
    ~Pet();
    static int GetCount();
    virtual void Play() = 0; //声明为抽象方法,那么就不用在基类Pet中写具体实现了
protected:
    string name;
       
private:
    static int count;
};
int Pet::count = 0;
class Cat : public Pet
{
public:
    Cat(string name_c);  //注意命名
    void Play();
       
protected:
    string NAME_C;  //注意命名
};
class Mouse : public Pet
{
public:
    Mouse(string name_m);//注意命名
    void Play();
       
protected:
    string NAME_M;//注意命名
};
Pet::Pet(string name)
{
    this->name = name;
    count++;
    cout << "有一只宠物诞生了。。。。。。^_^!叫作:" << name << endl;
}
Pet::~Pet()
{
    count--;
    cout << "有一只叫作" << name << "的宠物挂掉了。。。。。。T_T!让人无比的心痛!!!" << endl;
}
Cat::Cat(string name_c) : Pet(name_c),NAME_C(name_c)  //初始化列表增加对NAME_C的初始化
{
    ;
}
void Cat::Play()
{
    cout<<NAME_C << " 在玩儿毛线球^_^" << endl;                    //注意输出的变量
}
Mouse::Mouse(string name_m) : Pet(name_m),NAME_M(name_m)   //初始化列表增加对NAME_M的初始化
{
    ;
}
void Mouse::Play()
{
    cout << NAME_M << " 在打洞。。。。。。^_^" << endl;   //注意输出的变量
}
int Pet::GetCount()
{
    return count;
}
int main()
{
    Pet *cat = new Cat("Tom_3号");
    Pet *mouse = new Mouse("Jerry_3号");
    cat->Play();                 
    mouse->Play();
    delete cat;   //删除new
    delete mouse;   //删除new
    return 0;
}

程序有两个比较大的问题:
1. 命名混乱,子类和父类的成员函数命名一样,输出到底是父类的name还是子类的name,尤其还将name定义成static,这样容易造成代码阅读不清晰;
2. new一定要跟delete配对,不配对造成内存溢出。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-14 09:33:28 | 显示全部楼层
matrixgadener 发表于 2019-10-12 18:25
原因在于:Cat::Cat(string name) : Pet(name)中后半部分“: Pet(name)”是初始化列表(不是继承关系),意 ...

非常感谢!谢谢您的指点!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 17:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表