首页 > 解决方案 > 用另一个替换 shared_ptr 对象

问题描述

基本上我有它里面的基类Employeeenum class和派生类Worker, Intern,以及描述它们Manager的指定字段。enum

class Employee {
public:
    enum class Status {
        Intern,
        Worker,
        Manager
    };
protected:

    int employeeID;
    std::string Name;
    std::string Surname;
    int Salary;
    bool Hired;
...
}

class Worker : public Employee {

protected:

    Status status = Status::Worker;
}

// "Intern" and "Manager" same way.

我存储对象并通过引用vector<shared_ptr<Employee>> Firm;修改它们。sourceEmployee[index]

我想做的是:

提升/降级员工,如何?我想寻找指定的员工并检查他的状态。如果是Worker我想删除Worker class对象并Manager改为创建对象,则所有字段都保存为Worker:姓名,姓氏等。

我的原型(不工作)看起来像这样:

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

        switch(sourceEmployee[index]->getStatus()) { // returning status

            case Intern::Status::Intern: // does it recognize object properly?

                auto tmp0 = std::move(*it);
                (*it).reset();                         // ??
                *it = std::make_shared<Worker>(tmp0);

                cout << "Employee " << id << " has been promoted" << endl;
                break;

标签: c++objectreplaceshared-ptr

解决方案


这就是我在你的例子中看到的。Employee与其派生类之间的唯一区别是派生类每个都有一个Status字段。该字段在所有派生类中具有相同的用途。
问题:为什么有派生类?只需在员工升职降职时status参与其中Employee并为其分配适当的价值。那么您的问题的答案是您只需分配status一个新值(可能是通过类方法)。

也许你省略了关键细节。也许还有其他领域,所以有派生类是有原因的。
质疑一个类的所有对象是否status都相同,为什么它不是一个static const?(即便如此,感觉就像数据重复。可能有更好的方法来实现您的目标。)

如果要将一个派生类转换为另一个派生类,您可能需要为每个派生类定义一个构造函数,该构造函数将对基类的引用作为参数。这将调用基类上的复制构造函数,然后初始化新类的字段。(如果基类中没有要复制的字段,那么您的数据组织得不好。)

Worker::Worker(const Employee & person) : Employee(person) {}

至于调用它,看起来您正在进行不必要的簿记,这可能会导致错误。但是,很难说,因为您的代码不完整。对周围的上下文进行猜测,可能会出现以下情况:

it->reset(std::make_shared<Worker>(**it));

当然,这种语法是否正确取决于it声明的方式以及it赋值的方式(两者都没有出现在问题中)。


现在让我们继续改进您的数据组织。您可能会发现,与其派生自Employee,不如拥有一个JobInternWorkerManager派生的类。然后Employee可以有一个(智能)指针Job,指向您的工作相关数据所在的位置。作为一个好处,切换工作时不需要复印;只需删除旧Job对象并分配一个新对象。(这可以看作是我提到的第一种情况的概括,其中status简单地分配了一个新值。)


推荐阅读