簡體   English   中英

用另一個替換shared_ptr對象

[英]Replace shared_ptr object with another one

基本上,我的基類Employeeenum class ,派生類WorkerInternManager具有從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派生,不如從InternWorkerManager派生一個Job類會更好。 然后, Employee可以有一個(智能)指向Job指針,您的與工作相關的數據將駐留在其中。 好處是,切換作業時無需復制; 只需刪除舊的Job對象並分配一個新的Job對象即可。 (這可以看作是我提到的第一種情況的概括,在這種情況下, status僅被分配了一個新值。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM