【问题标题】:Operator overloading inheritance with classes [closed]带有类的运算符重载继承[关闭]
【发布时间】:2015-06-08 20:42:42
【问题描述】:

我是编码新手,我正试图了解这个程序有什么问题:

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;
}

在 main 中有这个:

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+'|

【问题讨论】:

  • 请避免指针和愚蠢的继承(公司->员工)
  • 您发布的错误消息和发布的代码不匹配。发布的代码中没有调用operator+
  • @RSahu:有。但它并不明确。

标签: c++ operator-overloading


【解决方案1】:

您正在将运算符“+=”应用于指向 Company 的 指针,而不是 Company 实例或对实例的引用。 取消引用指针,例如(*company) += a; 将毫无怨言地编译。

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

【讨论】:

  • 非常感谢!你有什么建议吗?我必须尽一切努力使公司 += 编译并运行良好
  • “我必须尽一切努力使公司 += 编译并运行良好”首先让我们解决一件事:如果 companya 是指针,那么只需+= 的过载无法正常工作。你一定是想让company 成为Company 的一个实例,而aEmployee 的一个实例。这可以像这样完成,在Company:Company &amp;operator+=(const Employee &amp;e) { _table.push_back(e.clone()); return *this; } 内部你使用了不必要的指针,只需使用变量而不是指针变量
  • 明白了..对不起,老师改了..他添加了指向公司的指针..对不起,这是他的错...非常感谢!!!!!!你真的帮了我很多+1
【解决方案2】:

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);

【讨论】:

  • 兄弟感谢您的帮助,但我需要制作公司 += 作品并收集好的任何建议?
  • @OperatorOverload,你为什么“需要”支持company += a;?这是一个不好的范例。
  • @R Sahu 这正是练习中写的,我卡在那里..
  • @OperatorOverload,你不能在两个指针之间重载+=。语言不允许。如果你的练习需要它,那一定是一个技巧问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 2012-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多