c++基类、子类及赋初值没学明白
自己测试程序,但有错误,还请高手帮忙找错#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;
};
错误提示:
自己没弄明白错在哪里{:5_96:}
fairylee83 发表于 2018-3-7 13:25
33行是子类构造器继承基类构造器,所以为空啊?
我看小甲鱼的视频里是这样写的。
对不起,之前没仔细看
这里因为逻辑不对,“张三”是一个人名,你将它初始化了一个部门的名称
所以以为你没有进行初始化
你的代码的问题在于不能这样初始化一个对象
用 ="张三"是不行的,需要用括号的方式 你的构造函数都没写,初始化的时候如何知道将“张三”赋值给谁? BngThea 发表于 2018-3-7 11:47
你的构造函数都没写,初始化的时候如何知道将“张三”赋值给谁?
构造函数是指构造器吗?26行不是基类构造器定义吗?{:5_96:}
学得有点晕。 fairylee83 发表于 2018-3-7 13:11
构造函数是指构造器吗?26行不是基类构造器定义吗?
学得有点晕。
你那是基类的构造函数,子类的构造函数呢?第33行,函数实现为空 BngThea 发表于 2018-3-7 13:17
你那是基类的构造函数,子类的构造函数呢?第33行,函数实现为空
33行是子类构造器继承基类构造器,所以为空啊?
我看小甲鱼的视频里是这样写的。
我再按您说的调试一下试试 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;
};
是这样改吗?还是不行哦。{:5_96:} fairylee83 发表于 2018-3-7 13:30
是这样改吗?还是不行哦。
第49行,
Members M1("张三");
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;
};
改了,程序运行算是没错了。但是运行程序得出的结果和我预想的有出入。
1、张三赋给了部门。我的设想是赋给成员名。这个是因为子构造器和基构造器继承的关系吗?改子的,基的也变?
2、我想通过M1.work(M1.MemName)打印张三正在努力工作。好像也没成功。
3、Member M1("张三");这是对构造器赋值还是对Member类对象M1的MemName属性赋值?
学成浆糊了。{:5_99:}
fairylee83 发表于 2018-3-7 14:00
重新改了
是的,所以你还需要对基类的构造函数简单改造一下,可以重写一个默认构造函数,然后子类构造的时候不要对基类进行初始化 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;
};
改成protected吗?然后子构造器不继承基构造器?
还是出错,快被虐哭了 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;
} BngThea 发表于 2018-3-7 14:48
不要着急,我根据你的思路给你一个简单的写法,你自己好好参考一下
谢谢大神{:5_91:}
页:
[1]