2015-06-08 3 views
-2

Я новичок в кодировании, и я пытаюсь понять, что случилось с этой программой:Перегрузка операторов наследование с классами

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

Избегайте указатели и глупо наследование (компания-> сотрудник) –

+0

Опубликованного сообщение об ошибке и помещаемого код не совпадает вверх. В отправленном коде нет вызова 'operator +'. –

+0

@RSahu: есть. он не является явным, хотя. –

ответ

2

Вы подаете оператор '+ =' на указатель т o Компания вместо Компания экземпляр или ссылка на экземпляр. Выведите указатель на указатель, например (*company) += a; будет компилироваться без рекламаций.

Пожалуйста, не перегружайте операторов указателями, сначала перегружайте ссылки на константу, и берете их от этого.

+0

большое спасибо! У вас есть предложение, как это сделать? Я должен сделать все, чтобы сделать компанию + = компилировать и работать хорошо – OperatorOverload

+0

«Я должен сделать все, чтобы сделать компанию + = компилировать и работать хорошо», сначала позвольте нам разобраться с чем-то: если «компания» и 'a' являются указателями, тогда просто нет возможности для перегрузки' + = 'для работы. Вы должны иметь 'компанию', являющуюся экземпляром' Company' и 'a' экземпляром' Employee'. Это можно сделать следующим образом: внутри 'Company': ' Компания & оператор + = (const Employee & e) { _table.push_back (e.Клон()); возвращение * это; } '}' } Вы используете указатели без необходимости, просто используйте переменные вместо переменных указателя – EdMaster

+0

понял .. извините, но учитель изменил его .. он добавил указатель на компанию .. извините, но его ошибка ... спасибо очень много !!!!! вы действительно помогли мне много +1 – OperatorOverload

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

bro спасибо за помощь , но мне нужно сделать компанию + = a работает и компилировать хорошо любые предложения? – OperatorOverload

+0

@OperatorOverload, почему вы «нуждаетесь» в поддержке 'company + = a?'? Это плохая парадигма. –

+0

@R Sahu это именно то, что написано в упражнении, им застряли там. – OperatorOverload

Смежные вопросы