运算符使用类重载继承

时间:2015-06-08 20:42:43

标签: c++ operator-overloading

我是编码的新手,我正在努力了解这个程序的错误:

class Company:public Employee{
private:
    std::vector<Employee*> _table;
public:
    Company& operator+=(const Employee* emp) {
         _table.push_back(emp->clone());
          return *this;
     }
     virtual Company* clone() const {
         return new Company(*this);
     }
     virtual Company& setDescription(std::string des){
          _des=des;
     return *this;
}

主要有这个:

Company* company = new Company();
a = new DeveloperEmployee(description, project);
int id = a->getID();
cout << *a << endl; //Developer ID = 2, project = hw5

company += a;

我有这个错误:

   error: invalid operands of types 'Company*' and 'DeveloperEmployee*' to binary 'operator+'|

2 个答案:

答案 0 :(得分:2)

您正在应用运营商&#39; + =&#39;在指针到公司而不是公司实例或对实例的引用。 取消引用指针,例如(*company) += a; 将无怨无悔地编译。

请不要在指针上重载操作符,首先在const引用上重载,然后从中获取它。

答案 1 :(得分:0)

FWIW,使用

Company& operator+=(const Employee* emp) {
     _table.push_back(emp->clone());
      return *this;
 }

Employee添加Company是滥用+=运算符的语义。

更好的选择是:

Company& addEmployee(const Employee& emp) {
     _table.push_back(emp.clone());
      return *this;
 }

然后,您可以使用:

Company* company = new Company();
a = new DeveloperEmployee(description, project);
int id = a->getID();
cout << *a << endl; //Developer ID = 2, project = hw5

company->addEmployee(*a);

这将使代码更易于阅读和遵循。

进一步改善

不使用指向Employee的指针列表,而是使用列表智能指针。

std::vector<std::share_ptr<Employee>> _table;

Company& addEmployee(std::shared_ptr<Employee> emp) {
     _table.push_back(emp);
      return *this;
 }

并将其用作:

Company* company = new Company();
std::shared_ptr<Employee> a(new DeveloperEmployee(description, project));
int id = a->getID();
cout << *a << endl;

company->addEmployee(a);