【发布时间】:2018-06-23 14:24:23
【问题描述】:
基本上,我有基类Employee,里面有enum 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;
【问题讨论】:
-
在我看来,如果您对每个状态都有一个对象类型,并且另外将相关状态存储在每个对象类型中,那么您就是在复制信息。当您重复识别某些事物的方法时,您会引入它们可能不同步的可能性。
-
@Galik 我只是想要一些东西来区分对象。我认为最好使用
enum class而不是仅仅放置字段,即std::string status = "Intern",因为枚举更快。说到指针,我应该如何替换对象? -
您确定您正在解决正确的问题吗?看起来所有员工都应该直接由员工类表示,它只包含正确的信息。
-
越来越好。现在有一个
it的声明。接下来:sourceEmployee的声明(或将“Firm”更改为“sourceEmployee”)。另外需要考虑的一点:如果您使用从 ID 到员工的std::map而不是员工的vector,则通过 ID 查找会更快。
标签: c++ object replace shared-ptr