用另一个替换shared_ptr对象

时间:2018-06-23 14:24:23

标签: c++ object replace shared-ptr

基本上我有一个带有Employee的基类enum class,以及派生类WorkerInternManager的派生类,它们具有{{1} }描述它们。

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

1 个答案:

答案 0 :(得分:0)

这是我在您的示例中看到的。 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派生,不如从JobInternWorker派生一个Manager类,会更好。然后Employee可以有一个指向Job的(智能)指针,您的工作相关数据将驻留在该指针中。好处是,切换作业时无需复制;只需删除旧的Job对象并分配一个新的对象即可。 (这可以看作是我提到的第一种情况的概括,其中简单地为status分配了一个新值。)