C++ 我可以在这个设计中使用动态投影以外的东西吗?
在我们的系统中,我们有C++ 我可以在这个设计中使用动态投影以外的东西吗?,c++,oop,design-patterns,casting,dynamic-cast,C++,Oop,Design Patterns,Casting,Dynamic Cast,在我们的系统中,我们有 多设备类型 每个设备类型可以有不同的配置类型 每个设备类型都将是自己的库 我的处境是,我被迫使用dynamic_cast。我想知道是否有更好的设计方法 我得到的是: // in common code class Config {public: virtual ~Config(){} }; class Device { protected: Config* devConfig; protected: vir
- 多设备类型
- 每个设备类型可以有不同的配置类型
- 每个设备类型都将是自己的库
// in common code
class Config {public: virtual ~Config(){} };
class Device {
protected:
Config* devConfig;
protected:
virtual void createDevConfig() = 0;
public:
virtual void display() = 0;
};
// Device specific Code
class A0Device : public Device {
protected:
virtual void createDevConfig() { this->devConfig = new A0Config(); }
public:
A0Device() { this->createDevConfig(); }
virtual void display(){
A0Config* config = dynamic_cast<A0Config*>(this->devConfig);
if(!config) std::cout << "Null object\n";
}
};
class A0Config : public Config {};
int main() {
Device* dev = new A0Device();
dev->display();
return 0;
}
//在公共代码中
类Config{public:virtual~Config(){};
类设备{
受保护的:
配置*devConfig;
受保护的:
虚拟void createDevConfig()=0;
公众:
虚空显示()=0;
};
//设备特定代码
A0类设备:公共设备{
受保护的:
虚拟void createDevConfig(){this->devConfig=new A0Config();}
公众:
A0Device(){this->createDevConfig();}
虚拟空显示(){
A0Config*config=dynamic_cast(此->devConfig);
如果(!config)std::cout display();
返回0;
}
本质上,
A0Device
有自己的配置类型:A0Config
,它由其他成员组成。A0Device在基类中将devConfig
定义为config*
。在A0Device::display()
-我需要访问devConfig对象(作为A0Config
类型)。虚拟createDevConfig()确保配置对象始终为A0Device
=>中的A0Config
类型。在这里使用动态强制转换是否安全?是否有更好的设计方法?您可以在基址中使用纯虚拟函数,该函数返回config
指针或引用(除非您需要指针,否则我更愿意使用该指针),然后将存储在派生类中。此问题/答案涵盖指针和引用之间的差异:
这种设计的优点是,基础中需要Config
的任何东西都可以使用getConfig
,而需要使用派生类的任何东西都可以不强制转换。此外,您不需要调用new
和delete
class Device {
protected:
virtual Config& getConfig() = 0;
...
};
class A0Device {
public:
...
Config& getConfig() {return config;}
...
private:
A0Config config;
};
您可以在基类中有一个纯虚拟函数,它返回一个
Config
指针或引用(除非您需要指针,否则我更喜欢它),然后在派生类中有存储。此问题/答案涵盖了指针和引用之间的区别:
这种设计的优点是,基础中需要Config
的任何东西都可以使用getConfig
,而需要使用派生类的任何东西都可以不强制转换。此外,您不需要调用new
和delete
class Device {
protected:
virtual Config& getConfig() = 0;
...
};
class A0Device {
public:
...
Config& getConfig() {return config;}
...
private:
A0Config config;
};
您可以在基类中有一个纯虚拟函数,它返回一个
Config
指针或引用(除非您需要指针,否则我更喜欢它),然后在派生类中有存储。此问题/答案涵盖了指针和引用之间的区别:
这种设计的优点是,基础中需要Config
的任何东西都可以使用getConfig
,而需要使用派生类的任何东西都可以不强制转换。此外,您不需要调用new
和delete
class Device {
protected:
virtual Config& getConfig() = 0;
...
};
class A0Device {
public:
...
Config& getConfig() {return config;}
...
private:
A0Config config;
};
您可以在基类中有一个纯虚拟函数,它返回一个
Config
指针或引用(除非您需要指针,否则我更喜欢它),然后在派生类中有存储。此问题/答案涵盖了指针和引用之间的区别:
这种设计的优点是,基础中需要Config
的任何东西都可以使用getConfig
,而需要使用派生类的任何东西都可以不强制转换。此外,您不需要调用new
和delete
class Device {
protected:
virtual Config& getConfig() = 0;
...
};
class A0Device {
public:
...
Config& getConfig() {return config;}
...
private:
A0Config config;
};
[不确定,如果我在这里遗漏了什么,但听起来或多或少像是设计的味道] 为什么不能
A0Config
聚合Config
通常,点击dynamic\u cast
会提示在建立is-a关系方面存在一些不正确的地方。在这种情况下,A0Config
提供了一些功能(getA()
)它不适合它的基类Config
,可能它违反了strong is-A
然而,
…而肖恩·帕伦特也达到了这个程度。[不确定,如果我在这里遗漏了什么,但这或多或少听起来像是设计的味道] 为什么不能
A0Config
聚合Config
通常,点击dynamic\u cast
会提示在建立is-a关系方面存在一些不正确的地方。在这种情况下,A0Config
提供了一些功能(getA()
)它不适合它的基类Config
,可能它违反了strong is-A
然而,
…而肖恩·帕伦特也达到了这个程度。[不确定,如果我在这里遗漏了什么,但这或多或少听起来像是设计的味道] 为什么不能
A0Config
聚合Config
通常,点击dynamic\u cast
会提示在建立is-a关系方面存在一些不正确的地方。在这种情况下,A0Config
提供了一些功能(getA()
)它不适合它的基类Config
,可能它违反了strong is-A
然而,
…而肖恩·帕伦特也达到了这个程度。[不确定,如果我在这里遗漏了什么,但这或多或少听起来像是设计的味道] 为什么不能
A0Config
聚合Config
通常,偶然发现dynamic_cast
是一条线索,表明在建立is-a关系方面存在一些问题