Замена объекта в векторе производных объектов "нет подходящей функции для вызова" - PullRequest
0 голосов
/ 24 июня 2018

У меня есть класс Employee и производные классы Worker и Intern.Я храню их в vector<shared_ptr<Employee>> Firm; Теперь я хочу повысить Intern до Worker, заменив производный объект Intern в vector на Worker, сохранив все поля из Employee.

У меня есть:

void Promote(vector<shared_ptr<Employee>>& sourceEmployee) {

auto it = std::find_if(sourceEmployee.begin(), sourceEmployee.end(),
                              [&sourceEmployee, id](const auto &obj) { return obj->getID() == id; });

            if (it != sourceEmployee.end()) {
                auto index = std::distance(sourceEmployee.begin(), it);

                switch(sourceEmployee[index]->getnum()) { // returning num / recognizing specified class obj

                    case 0: {     // It's Intern, lets make him Worker
                        auto tmp0 = std::move(*it);
                        *it = std::make_shared<Worker>(*tmp0); // WORKING now
                        cout << "Employee " << id << " has been promoted" << endl;
                        break;
                    }

class Employee {
//basic c-tors etc.
protected:
    int employeeID;
    std::string Name;
    std::string Surname;
    int Salary;
    bool Hired;
};

class Intern : public Employee {

protected:
static const int num = 0;
};

class Worker : public Employee {

protected:
static const int num = 1;
};

Так что в основном мне нужно уничтожить Intern объект и создать вместо него Worker в том же месте.

РЕДАКТИРОВАТЬ: Решено.Мне нужно было сделать правильный конструктор и добавить * перед tmp) ^ _ ^

1 Ответ

0 голосов
/ 24 июня 2018

Проблема в том, что у вас Worker нет конструктора, принимающего std::shared_ptr<Employee>, как говорит вам компилятор.

В этой строке:

*it = std::make_shared<Worker>(tmp0);

std::make_shared создаст объект, вызвав конструктор с tmp0 в качестве аргумента.

Примечание: вам не обязательно делать это: (*it).reset(). Вызвав std::move строку выше, вы уже сбросили общий указатель.

...