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