使用带有派生类

时间:2015-06-08 17:19:57

标签: c++ vector

我正在尝试使用向量来导出类Employee,但我得到了错误:

class Company : public Employee, public TesterEmployee, public DeveloperEmployee {
private:
   std::vector<Employee*> _table;
public:
    friend std::vector<Employee*>& operator+=(const Employee* emp) {
        _table.push_back(emp->clone());
        return *this;
    }
};

错误是:

  

错误:'std::vector<Employee*>& operator+=(const Employee*)'必须具有类或枚举类型的参数

2 个答案:

答案 0 :(得分:0)

+=是二元运算符。功能

friend std::vector<Employee*>& operator+=(const Employee* emp) {
    _table.push_back(emp->clone());
    return *this;
}

定义了一个只能有一个参数的非成员函数。因此,它不能用在如下表达式中:

a += b;

您需要的是:

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

答案 1 :(得分:0)

回答有关相同代码的其他问题(您删除了https://stackoverflow.com/questions/30717107/operator-overloading-in-my-class-with-error):

  

以及问题:

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

这是什么意思?

这意味着您正在尝试用C ++编写Java / C#代码。不要那样做。

  • 特别是你为了OOP而滥用OOP。 Company不是Employee(请参阅Liskov),而company + employee没有意义。

  • 丢失new

  • 丢失基类。

  • 可能会丢失基于clone的动态值语义。

最后,您的问题是,您使用的operator+=并未超载。

Live On Coliru

#include <vector>
#include <iostream>

struct Employee {
    int getID() const { return _id; }

  private:
    int _id = generate_id();

    static int generate_id() {
        static int next = 0;
        return ++next;
    }
};
struct DeveloperEmployee : Employee {
    DeveloperEmployee(std::string const& descr, std::string const& project)
        : _description(descr), _project(project) { }

  private:
    std::string _description;
    std::string _project;

    friend std::ostream& operator<<(std::ostream& os, DeveloperEmployee const& de) {
        return os << "id:" << de.getID() << " descr:'" << de._description << "' project:'" << de._project << "'"; 
    }
};

class Company {
  private:
    std::vector<Employee> _table;
    std::string _des;

  public:
    Company &operator+=(const Employee &emp) {
        _table.push_back(emp);
        return *this;
    }
    void setDescription(std::string des) { _des = des; }
};


int main() {
    Company company;
    DeveloperEmployee a("description", "project");

    int id = a.getID();
    std::cout << a << std::endl; // Developer ID = 2, project = hw5

    company += a;
}