c++ - 用另一个替换 shared_ptr 对象
问题描述
基本上我有它里面的基类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;
解决方案
这就是我在你的例子中看到的。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
简单地分配了一个新值。)
推荐阅读
- c++ - 当可以用 git 完成时,为什么要在 CMake 中添加版本号?
- c# - Xamarin如何在按钮单击MVVM时更改背景颜色
- javascript - 双击时删除奇数 ID Div 之前的 Div
- php - 部署在服务器上时,PDF 上的 Yii2 引导表是半角
- google-bigquery - 将 BigQuery 连接到 Looker
- python - Python - 尝试以某种方式从 API 结果打印 json 数据
- ms-access - 使 Access 数据库字段结构更改传播到 Delphi 应用程序
- java - 将 2 个 sql 表中的数据显示到单个 Jtable
- django - 如何在 Django 中增加会话内部?
- javascript - API 显示 [object, Object] 而不仅仅是事实文本