[英]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 的共享指針。這似乎是您唯一缺少的部分。
#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.