我在将一个对象添加到集合时遇到了问题。
我在头文件中使用两个类,一个用于员工,另一个用于管理员。在经理类中,我想通过添加特定经理的下属员工来创建一组员工。首先,我创建一个空集,我可以通过调用函数来添加对象。
看起来如下:
头文件
#ifndef EMPLOYEE_HH
#define EMPLOYEE_HH
#include <set>
#include <string>
#include <iostream>
using namespace std ;
class Employee {
public:
// Constructor
Employee(const char* name, double salary) :
_name(name),
_salary(salary) {
}
// Accessors
const char* name() const {
return _name.c_str() ;
}
double salary() const {
return _salary ;
}
private:
string _name ;
double _salary ;
} ;
class Manager : public Employee {
public:
//Constructor
Manager(const char* _name, double _salary):
Employee(_name, _salary),
_subordinates() {
}
// Accessors/Modifiers
void addSubordinate(Employee& empl) {
_subordinates.insert(empl) ; // Error: no macthing function call for .insert()
}
private:
set<Employee*> _subordinates ;
} ;
#endif
主要脚本
#include <string>
#include <iostream>
#include "Employee.hh"
using namespace std ;
int main() {
Employee emp = ("David", 10000) ;
Manager mgr = ("Oscar", 20000) ;
mgr.addSubordinate(emp);
return 0;
}
编译时,我得到的错误是_subordinates.insert(empl)
无法调用匹配函数。
答案 0 :(得分:1)
元素的set
类型为Employee*
,但您正在插入Employee
。
您可以将_subordinates.insert(empl);
更改为_subordinates.insert(&empl);
。
(将_subordinates
的类型从set<Employee*>
更改为set<Employee>
也可以修复编译器错误,但似乎与请求不匹配。)
注意@KenmanTsang指出,使用从堆栈变量获取的指针可能很危险。考虑将smart pointer与new
一起使用,例如std::set<std::unique_ptr<Employee>> _subordinates;
。
顺便说一句:
Employee emp = ("David", 10000) ;
Manager mgr = ("Oscar", 20000) ;
应该是
Employee emp ("David", 10000) ;
Manager mgr ("Oscar", 20000) ;
或(从c ++ 11开始)
Employee emp = {"David", 10000} ;
Manager mgr = {"Oscar", 20000} ;
答案 1 :(得分:1)
你可以通过
解决A)
// Accessors/Modifiers
void addSubordinate(Employee& empl) {
_subordinates.insert(new Employee(empl));
}
利弊。容易解决问题。
利弊。无论调用者对象是否无效。您保存的副本是安全的
缺点。您需要自己进行内存管理。删除~Manager();
中的所有对象b)中
private:
set<Employee> _subordinates;
利弊。无需改变功能
利弊。由编译器完成的自动内存管理
缺点。用Employee类调用太多的复制(插入和检索时)