[英]Replace shared_ptr object with another one
基本上,我的基類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
對象,而是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
派生,不如從Intern
, Worker
和Manager
派生一個Job
類會更好。 然后, Employee
可以有一個(智能)指向Job
指針,您的與工作相關的數據將駐留在其中。 好處是,切換作業時無需復制; 只需刪除舊的Job
對象並分配一個新的Job
對象即可。 (這可以看作是我提到的第一種情況的概括,在這種情況下, status
僅被分配了一個新值。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.