簡體   English   中英

shared_ptr 派生 class

[英]shared_ptr to derived class

我是 C++ 的新手,我仍在學習編寫干凈的代碼。

以下是我現有的遺留代碼的摘錄。

class A {
public:
    setDataManager(dm)
    {
        _dm = dm;
    }

    void recieveData(data)
    {
        _dm.processData(data);
    }

private:
    std::shared_ptr<DataManager> _dm;
};

class DataManager {

public:
    void processData(data)
    {
        DecodeData dd;
        dd.Decode(data);

        if (decoded data conatains a value XYZ) {
            doActionA();
        }
    }
};

class DecodeData {

public:
    void decode(data)
    {
        //if data contains key 1
        // store the value (setters and getters defined)
        //if data contains key 2
        // store the value.
        ......
    }
};

main()
{
    //ConfigManager reads the location type from config file

    A a;
    std::shared_ptr<DataManager> dm = std::make_shared<DataManager>(...);
    a.setDataManager(dm);

    //a.recieveData() gets called
}

收到的數據特定於位置類型。

目前,遺留代碼僅針對一個位置(紐約)定義。

現在我必須向配置管理器(澳大利亞)添加另一個位置。 這意味着我需要在 decode(data) 中添加更多語句,並在processData()中添加額外的doActions() ) ;

我想通過分離紐約和澳大利亞位置的處理來編寫干凈的代碼,因為接收到的數據因不同位置而異。 我想要 base class,並根據位置類型拆分處理。

我無法將其概念化。 可能嗎? 我該如何處理?

謝謝你。

您可以創建一個指向派生 class 的共享指針,並將其分配給一個指向基數 class 的共享指針。這似乎是您唯一缺少的部分。

https://godbolt.org/z/Gf7fb1

#include <memory>

class Base 
{
    public: 
        virtual int Foo(); 
};

class Derived:public Base
{
    public: 
        virtual int Foo(); 
};

int main()
{
    std::shared_ptr<Base> ptrBase = std::make_shared<Derived>();
    ptrBase->Foo();
}

因此,在您的情況下,您只需要使用類似的方法創建正確類型的DataManager

std::make_shared<DataManagerSpecial>;

然后,確保DataManager在其基數 class 中具有正確且靈活的 API。DataManagerSpecial 顯然需要從DataManagerSpecial DataManager

暫無
暫無

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

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