gpt4 book ai didi

c++ - 没有匹配调用 employee::employee() 的函数

转载 作者:行者123 更新时间:2023-11-30 00:35:33 24 4
gpt4 key购买 nike

我正在尝试来自 TCPL 的派生类示例。

经理是一种具有附加级别信息的员工。我一直收到错误:

no matching function for call to employee::employee() 
in the constructor of manager::manager()

employee 的所有成员都是公开的并且可以访问。管理器构造函数有什么问题?

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


class employee{
public:
enum type {M,E};
type hier;
string id;
employee(string idd):hier(E){id=idd;};
};

class manager: public employee{
public:
int level;
manager(string idd, int lv){hier=employee::M; id=idd;level=lv;};
};

void print(employee *x){
if(x->hier == employee::E){
cout<<"I am employee with id "<<x->id<<endl;
}
else{
cout<<"I am manager with id "<<x->id<<endl;
manager* y=static_cast<manager *>(x);
cout<<"My level is "<<y->level<<endl;
}
}

int main(){
employee t("334");
manager u("223", 2);
print(&t);
print(&u);
}

第二个版本之前的版本封装不好

这是新版本

#include <iostream>
using namespace std;

enum type {M, E};

class employee{
string id;
type hier;
public:
employee(string idd, type hi=E):hier(hi),id(idd){}
string whatid(){return id;}
type whattype(){return hier;}
};

class manager: public employee{
int level;
public:
manager(string idd, int lv):employee(idd,M),level(lv){}
int whatlv(){return level;}
};

我没有直接访问 employee 和 manager 的私有(private)成员,而是将成员设为私有(private)并使用一个函数来访问它们。

#include <iostream>
#include <string>
#include "manager_employee.h"
using namespace std;

void print(employee *x){
if(x->whattype() == E){
cout<<"I am employee with id "<<x->whatid()<<endl;
}
else{
cout<<"I am manager with id "<<x->whatid()<<endl;
manager *y=(manager *)x;
// manager* y=static_cast<manager *>(x);
cout<<"My level is "<<y->whatlv()<<endl;
}
}

int main(){
employee t("334", E);
manager u("223", 2);
print(&t);
print(&u);
}

最佳答案

通过在 employee 中声明一个构造函数,您删除了它的默认构造函数;因此您不能在不指定 ID 的情况下创建一个。

这意味着任何派生类都需要向基类构造函数提供 ID:

manager(string idd, int lv) : employee(idd) {hier=employee::M; level=lv;}
// ^^^^^^^^^^^^^

为了保持一致性,您可能希望在初始化列表而不是构造函数主体中初始化 level;通过 employee 构造函数中的另一个参数将 hier 初始化为正确的值可能更有意义,而不是给它一个默认值然后覆盖它:

employee(string idd, type hier = E) : hier(hier), id(idd) {}
manager(string idd, int lv) : employee(idd, M), level(lv) {}

关于c++ - 没有匹配调用 employee::employee() 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18698646/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com