C++ 我想摆脱动态铸造。最好的选择是什么?

C++ 我想摆脱动态铸造。最好的选择是什么?,c++,casting,dynamic-cast,C++,Casting,Dynamic Cast,我向服务器发送数据和从服务器发送数据 我创建一条消息,设置类型(枚举)和需要传输的对象 消息以压缩JSON字符串的形式发送。 当我收到它时,我解析消息,实例化对象并开始填充它。当我需要实例化传输的数据时,我使用一个映射,其中包含类的名称作为键,指向构造函数的指针作为值 所有这些都很好,但现在我需要使用消息,并对其执行需要执行的操作(发送答案、写入数据库等)。 最好的方法是什么?现在,我检查消息的类型并获取每个传输的对象。但我不知道它们是什么类(不明确) 我是否应该动态播放所有内容(花费很多而不是

我向服务器发送数据和从服务器发送数据

我创建一条消息,设置类型(枚举)和需要传输的对象

消息以压缩JSON字符串的形式发送。 当我收到它时,我解析消息,实例化对象并开始填充它。当我需要实例化传输的数据时,我使用一个映射,其中包含类的名称作为键,指向构造函数的指针作为值

所有这些都很好,但现在我需要使用消息,并对其执行需要执行的操作(发送答案、写入数据库等)。 最好的方法是什么?现在,我检查消息的类型并获取每个传输的对象。但我不知道它们是什么类(不明确)

我是否应该动态播放所有内容(花费很多而不是很多)?我是否应该希望数据始终保持相同的顺序。或者我应该将对象存储为映射(使用名称或枚举作为键)并正确地强制转换它吗

我知道如果可能的话,不应该进行动态铸造。但在这里我想知道,从一开始就切换并创建正确的对象并向其提供JSON值吗?现在,整个消息是动态重建的,没有任何问题,我的消息管理器将处理处理,我是否应该更改它?

我同意Peter的观点

我可能会使用一个“嗅探器”函数,返回一个
enum类JType
将JSON映射到消息的关联类型

然后在switch/case块中使用该JType枚举调用相应的工厂函数,该函数将返回std::unique_ptr

解析失败将引发异常,而不是返回带有null ptr的唯一\u ptr


  • 每个关联的类类型都有一个工厂
  • 您将拥有一个嗅探器函数,该函数将确定JSON表示的类型,并返回一个枚举
  • 快乐的路径是
    JType e=sniff(message),如果(e==JType::Foo)std::unique\u ptr Foo=FooFactory(消息),则为
  • 从工厂抛出异常只会在消息的异常情况下发生,并且工厂不同意消息中应该包含的内容
没有基本类对象的列表,但enum类JType将具有到类的1:1映射

将JSON视为状态信息“脱水”,工厂函数将状态数据“再水化”为新对象。工厂函数可以是作为类的一部分的静态类函数,也可以是独立函数


层次结构用于多态性,但情况并非如此。

为什么不使用工厂模式根据收到的消息的内容创建合适的对象?那就根本不需要动态演员了。我同意彼得的观点。我可能会使用一个“嗅探器”函数返回一个映射到消息关联类型的枚举,然后在开关/案例块中使用该枚举调用相应的工厂函数,该函数将返回std::unique_ptr。解析失败将引发异常,而不是返回唯一的带有nullptr的\u ptr。@因此工厂函数将返回具有正确类型的指针,或者引发异常,而我将没有“基本类”对象的列表?我会要求每个工厂函数使用JSON,或者我可以稍后再输入它。这似乎是一个简单的解决方案,我可能试图使它过于动态,并在其中迷失了方向。每个关联的类类型都有一个工厂。您将拥有一个嗅探器函数,该函数将确定JSON表示的类型,并返回一个枚举。快乐的路径是JType e=sniff(message);,如果(e==JType::Foo)std::unique_ptr Foo=FooFactory(message)。。。抛出异常只会在消息的异常情况下发生,并且工厂不同意消息中应该包含的内容。没有基本类对象的列表,但enum类JType将具有到类的1:1映射。层次结构是用于多态性的,但情况并非如此。@Eljay如果你把它作为一个答案,我会接受它:)看起来比我想做的更干净、更简单(这几乎是动态的)。非常感谢。干净简单。我总是追求太复杂和无用的东西。