Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以在这个设计中使用动态投影以外的东西吗?_C++_Oop_Design Patterns_Casting_Dynamic Cast - Fatal编程技术网

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

在我们的系统中,我们有

  • 多设备类型
  • 每个设备类型可以有不同的配置类型
  • 每个设备类型都将是自己的库
我的处境是,我被迫使用dynamic_cast。我想知道是否有更好的设计方法

我得到的是:

// 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关系方面存在一些问题