如何解决shared_ptr到派生类
我对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
}
收到的数据是针对位置类型的。
当前,旧代码仅在一个位置(NewYork)定义。
现在,我必须向配置管理器(澳大利亚)添加另一个位置。
这意味着我需要在doActions()
中添加更多语句以解码(data),并在processData()
中添加其他 λ>
λ> xs1 = do { i <- [1..5] ; j <- [2..4] ; return i }
λ> xs1
[1,1,2,3,4,5,5]
λ>
λ> xs2 = do { i <- [1..5] ; j <- [2..4] ; return 9 }
λ> xs2
[9,9,9]
λ>
λ> xs3 = do { i <- [1..5] ; j <- [2..4] ; return (i,j) }
λ> xs3
[(1,2),(1,3),4),(2,(3,(4,(5,4)]
λ>
λ> length xs1
15
λ> length xs2
15
λ> length xs3
15
λ>
;
我想通过分离NY和Australia位置的处理来编写简洁的代码,因为不同位置收到的数据不同。 我想拥有基类,并根据位置类型拆分处理。
我无法将其概念化。可能吗? 我该如何处理?
谢谢。
解决方法
您可以创建指向派生类的共享指针,并将其分配给指向基类的共享指针。这似乎是您唯一缺少的一块。
#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
在其基类中具有正确且灵活的API。 DataManagerSpecial
显然需要从DataManager
派生。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。