C ++:将一个对象添加到一个集合中

时间:2016-04-30 15:05:10

标签: c++ inheritance set

我在将一个对象添加到集合时遇到了问题。

我在头文件中使用两个类,一个用于员工,另一个用于管理员。在经理类中,我想通过添加特定经理的下属员工来创建一组员工。首先,我创建一个空集,我可以通过调用函数来添加对象。

看起来如下:

头文件

#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)无法调用匹配函数。

2 个答案:

答案 0 :(得分:1)

元素的set类型为Employee*,但您正在插入Employee

您可以将_subordinates.insert(empl);更改为_subordinates.insert(&empl);

(将_subordinates的类型从set<Employee*>更改为set<Employee>也可以修复编译器错误,但似乎与请求不匹配。)

注意@KenmanTsang指出,使用从堆栈变量获取的指针可能很危险。考虑将smart pointernew一起使用,例如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类调用太多的复制(插入和检索时)