【问题标题】:Replacing object in vector of derived objects "no matching function to call"替换派生对象向量中的对象“没有要调用的匹配函数”
【发布时间】:2018-06-24 14:01:33
【问题描述】:

我有类Employee 和派生类WorkerIntern。我将它们存储在vector<shared_ptr<Employee>> Firm;

我有:

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) 之前添加* ^_^

【问题讨论】:

  • 假设你已经设法替换了你的对象。那么拥有shared_ptr&lt;Employee&gt; 有什么意义呢?每个拥有旧对象链接的人都将继续持有它。
  • 我想我会通过调用.reset() 来阻止这种情况,不是吗?
  • 不,不会。 reset 影响一个共享指针。
  • Worker::Worker(const Employee &amp;) 不是复制构造函数,它是一个以Employee为参数的普通构造函数。复制构造函数是Worker::Worker(const Worker &amp;)

标签: c++ object vector replace shared-ptr


【解决方案1】:

问题是你 Worker 没有构造函数采用 std::shared_ptr&lt;Employee&gt;,正如编译器告诉你的那样。

在这一行:

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

std::make_shared 将通过以tmp0 作为参数调用构造函数来构造对象。

旁注:您不必这样做:(*it).reset()。通过调用上面的std::move 行,您已经重置了共享指针。

【讨论】:

  • 所以我需要为Worker创建一个移动构造函数?
  • 由你决定 :) 你需要添加一个构造函数并使用适当的参数调用它。在您的示例中,您尝试将 std::shared_ptr&lt;Employee&gt; 传递给 ctor,因此它不会是移动构造函数(移动 ctor 将采用对 Worker 的右值引用)。
  • 老实说,我现在不知道该怎么办^^
  • 我想通了 :) 需要复制构造函数和(*tmp0)
猜你喜欢
  • 2014-02-02
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
  • 1970-01-01
相关资源
最近更新 更多