鱼C论坛

 找回密码
 立即注册
查看: 3061|回复: 12

[已解决]c++基类、子类及赋初值没学明白

[复制链接]
发表于 2018-3-7 11:27:42 | 显示全部楼层 |阅读模式
1鱼币
自己测试程序,但有错误,还请高手帮忙找错
#include <iostream>
#include <string>

class Department                                       //基类:部门
{
    public:
    std::string DepName;

    Department(std::string theName);           //基类构造器声明
    ~Department();

    void room();                                            //基类方法声明
};

class Members:public Department                 //子类:成员
{
    public:
    std::string MemName;

    Members(std::string theName);                //子类构造器声明
    ~Members();

    void work(std::string theName);              //子类方法声明
};

Department::Department(std::string theName)         //基类构造器定义
{
    DepName=theName;
    std::cout<<"部门名称:"<<DepName<<std::endl;
};


Members::Members(std::string theName):Department(theName)        //子类构造器定义
{
    
};

void Department::room()                                                                       //基类方法定义
{
    std::cout<<"房间号:405-2"<<std::endl;
}

void Members::work(std::string theName)                                              //子类方法定义
{
    std::cout<<theName<<"正在努力工作"<<std::endl;
}

int main()
{
    Members M1="张三";                                                             //子类成员1张三
    Department D1("研发部");                                                      //基类部门1研发

    D1.room();                                                                              //调用基类方法
    M1.work(M1.MemName);                                                          //调用子类方法

    return 0;
};

错误提示:
QQ截图20180307112638.png

自己没弄明白错在哪里
最佳答案
2018-3-7 11:27:43
fairylee83 发表于 2018-3-7 13:25
33行是子类构造器继承基类构造器,所以为空啊?
我看小甲鱼的视频里是这样写的。

对不起,之前没仔细看
这里因为逻辑不对,“张三”是一个人名,你将它初始化了一个部门的名称
所以以为你没有进行初始化

你的代码的问题在于不能这样初始化一个对象
用 ="张三"是不行的,需要用括号的方式

最佳答案

查看完整内容

对不起,之前没仔细看 这里因为逻辑不对,“张三”是一个人名,你将它初始化了一个部门的名称 所以以为你没有进行初始化 你的代码的问题在于不能这样初始化一个对象 用 ="张三"是不行的,需要用括号的方式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-7 11:27:43 | 显示全部楼层    本楼为最佳答案   
fairylee83 发表于 2018-3-7 13:25
33行是子类构造器继承基类构造器,所以为空啊?
我看小甲鱼的视频里是这样写的。

对不起,之前没仔细看
这里因为逻辑不对,“张三”是一个人名,你将它初始化了一个部门的名称
所以以为你没有进行初始化

你的代码的问题在于不能这样初始化一个对象
用 ="张三"是不行的,需要用括号的方式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-7 11:47:31 | 显示全部楼层
你的构造函数都没写,初始化的时候如何知道将“张三”赋值给谁?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-7 13:11:00 | 显示全部楼层
BngThea 发表于 2018-3-7 11:47
你的构造函数都没写,初始化的时候如何知道将“张三”赋值给谁?

构造函数是指构造器吗?26行不是基类构造器定义吗?
学得有点晕。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-7 13:17:31 | 显示全部楼层
fairylee83 发表于 2018-3-7 13:11
构造函数是指构造器吗?26行不是基类构造器定义吗?
学得有点晕。

你那是基类的构造函数,子类的构造函数呢?第33行,函数实现为空
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-7 13:25:25 | 显示全部楼层
BngThea 发表于 2018-3-7 13:17
你那是基类的构造函数,子类的构造函数呢?第33行,函数实现为空

33行是子类构造器继承基类构造器,所以为空啊?
我看小甲鱼的视频里是这样写的。
QQ截图20180307132443.png
我再按您说的调试一下试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-7 13:30:01 | 显示全部楼层
BngThea 发表于 2018-3-7 13:17
你那是基类的构造函数,子类的构造函数呢?第33行,函数实现为空
#include <iostream>
#include <string>

class Department
{
    public:
    std::string DepName;

    Department(std::string theName);
    ~Department();

    void room();
};

class Members:public Department
{
    public:
    std::string MemName;

    Members(std::string theName);
    ~Members();

    void work(std::string theName);
};

Department::Department(std::string theName)
{
    DepName=theName;
    std::cout<<"部门名称:"<<DepName<<std::endl;
};


Members::Members(std::string theName):Department(theName)
{
MemName=theName;
};

void Department::room()
{
    std::cout<<"房间号:405-2"<<std::endl;
}

void Members::work(std::string theName)
{
    std::cout<<theName<<"正在努力工作"<<std::endl;
}
int main()
{
    Members M1="张三";
    Department D1("研发部");

    D1.room();
    M1.work(M1.MemName);

    return 0;
};

QQ截图20180307132914.png
是这样改吗?还是不行哦。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-7 13:52:22 | 显示全部楼层
fairylee83 发表于 2018-3-7 13:30
是这样改吗?还是不行哦。

第49行,
Members M1("张三");

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-7 14:00:43 | 显示全部楼层
BngThea 发表于 2018-3-7 11:27
对不起,之前没仔细看
这里因为逻辑不对,“张三”是一个人名,你将它初始化了一个部门的名称
所以以为 ...

重新改了
#include <iostream>
#include <string>

class Department
{
    public:
    std::string DepName;

    Department(std::string theName);
    ~Department();

    void room();
};

class Members:public Department
{
    public:
    std::string MemName;

    Members(std::string theName);
    ~Members();

    void work(std::string theName);
};

Department::Department(std::string theName)
{
    DepName=theName;
    std::cout<<"部门名称:"<<DepName<<std::endl;
};
Department::~Department()
{
}


Members::Members(std::string theName):Department(theName)
{

};
Members::~Members()
{
}

void Department::room()
{
    std::cout<<"房间号:405-2"<<std::endl;
}

void Members::work(std::string theName)
{
    std::cout<<theName<<"正在努力工作"<<std::endl;
}
int main()
{
    Members M1("张三");
    Department D1("研发部");

    D1.room();
    M1.work(M1.MemName);

    return 0;
};
QQ截图20180307134952.png
改了,程序运行算是没错了。但是运行程序得出的结果和我预想的有出入。
1、张三赋给了部门。我的设想是赋给成员名。这个是因为子构造器和基构造器继承的关系吗?改子的,基的也变?
2、我想通过M1.work(M1.MemName)打印张三正在努力工作。好像也没成功。
3、Member M1("张三");这是对构造器赋值还是对Member类对象M1的MemName属性赋值?
学成浆糊了。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-7 14:06:09 | 显示全部楼层

是的,所以你还需要对基类的构造函数简单改造一下,可以重写一个默认构造函数,然后子类构造的时候不要对基类进行初始化
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-7 14:25:27 | 显示全部楼层
BngThea 发表于 2018-3-7 14:06
是的,所以你还需要对基类的构造函数简单改造一下,可以重写一个默认构造函数,然后子类构造的时候不要对 ...
#include <iostream>
#include <string>

class Department
{
    protected:
    std::string DepName;

    public:
    Department(std::string theName);
    ~Department();

    public:
    void room();
};

class Members:public Department
{
    public:
    std::string MemName;

    Members(std::string theName);
    ~Members();

    void work(std::string theName);
};

Department::Department(std::string theName)
{
    DepName=theName;
    std::cout<<"部门名称:"<<DepName<<std::endl;
};
Department::~Department()
{
}


Members::Members(std::string theName)
{
 MemName=theName;
};
Members::~Members()
{
}

void Department::room()
{
    std::cout<<"房间号:405-2"<<std::endl;
}

void Members::work(std::string theName)
{
    std::cout<<theName<<"正在努力工作"<<std::endl;
}
int main()
{
    Members M1("张三");
    Department D1("研发部");

    D1.room();
    M1.work(M1.MemName);

    return 0;
};

QQ截图20180307142309.png

改成protected吗?然后子构造器不继承基构造器?

还是出错,快被虐哭了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-7 14:48:03 | 显示全部楼层
fairylee83 发表于 2018-3-7 14:25
改成protected吗?然后子构造器不继承基构造器?

还是出错,快被虐哭了

不要着急,我根据你的思路给你一个简单的写法,你自己好好参考一下
#include <iostream>
#include <string>

class Department
{
public:
        std::string DepName;
        Department(){} //这里,添加一个默认构造函数即可
        Department(std::string theName);
        ~Department();

public:
        void room();
};

class Members:public Department
{
public:
        std::string MemName;

        Members(std::string theName);
        ~Members();

        void work();
};

Department::Department(std::string theName)
{
        DepName=theName;
        std::cout<<"部门名称:"<<DepName<<std::endl;
};
Department::~Department()
{
}


Members::Members(std::string theName)
{
        MemName=theName;
};
Members::~Members()
{
}

void Department::room()
{
        std::cout<<"房间号:405-2"<<std::endl;
}

void Members::work()//不需要形参,直接用成员变量即可
{
        std::cout<<MemName<<"正在努力工作"<<std::endl;
}

int main()
{
        Members M1("张三");
        Department D1("研发部");

        D1.room();
        M1.work();

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-7 14:54:29 | 显示全部楼层
BngThea 发表于 2018-3-7 14:48
不要着急,我根据你的思路给你一个简单的写法,你自己好好参考一下

谢谢大神
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-1 15:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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