【问题标题】:C++ Language Issue (Motivated By Google Protocol Buffer Application)C++ 语言问题(由 Google 协议缓冲区应用程序推动)
【发布时间】:2014-10-18 13:02:53
【问题描述】:

我的问题可能只是一个关于使用 c++ 语言的简单问题,但背景/动机涉及网络代码,所以我将其包含在内

背景:

我有一个应用程序,其中有一堆球根据各种规则四处移动。有一个服务器和一个客户端,应该尽可能同步每个球的状态。

我正在使用 Google 的协议缓冲区来创建允许客户端设置或更新每个球的消息对象。球有不同的状态,每个球可能需要使用 GPB 生成的不同消息类传输到客户端。例如,一种类型的球使用固定的加速度矢量更新其位置,因此对应于该类型球的消息将具有位置、速度和加速度。

我想将这些消息对象存储在按位置组织它们的数据结构中,以便客户端只能访问附近的消息对象。但是每条消息都有不同的类类型,所以我不知道如何正确地将它们全部放在一个结构中。

如果我是手写消息类,我会让它们都成为抽象 Message 基对象的子类,并带有一个枚举类型成员。然后我会将消息作为 unique_ptrs 存储到抽象类中,然后在需要单独处理每个对象时通过类型枚举进行静态转换。理想情况下,由于我需要序列化消息对象(它们每个都有一个 serializeToOutputStream(..))函数,我会将这个函数作为基类的抽象成员,并让每个特定的消息类覆盖它,这样我就可以在某些情况下避免强制转换。

问题是我不是手写这些类。它们是由 google 的编译器生成的。我敢肯定以前出现过这种情况,所以我想知道如果有的话,我应该如何优雅地处理它。

仅语言版本的问题:

我有一组固定的生成类 A、B、C、D...,它们都有一些常见的函数,如 serializeToStream()。更改这些类将非常繁琐,因为它们的源代码是由编译器生成的。我想将指向这些对象的唯一指针或原始指针存储在某种数据结构中,例如 std::map 或 std::vector,但我不知道该怎么做。如果可能的话,最好在不知道我正在处理哪个特定类的情况下调用它们都具有的一些函数(例如,如果我在向量中对所有它们调用序列化函数)。

【问题讨论】:

  • 你知道什么是擦除类型,你考虑过吗?
  • @Yakk 我从来没有听说过它,但我现在会去阅读它,看看它是否有帮助。谢谢。
  • TL;DR 但我猜你的帖子是否包含一个实际问题,它类似于 "我有不相关的课程 ABC 和 @ 987654324@ 并且需要将它们存储在容器中并稍后访问它们。我该怎么做?”
  • Google protobuf C++ API 已经有一个用于消息类型类的通用抽象基类。使用它。

标签: c++ networking c++11 protocol-buffers


【解决方案1】:

没有解决问题的好方法。只有讨厌的haks。例如,您可以在映射中存储指向对象的指针和指向某些假类型的方法的指针。但是你必须通过重新解释这个假类型来转换你的类和它的方法的指针。您必须记住,所有阅读您的代码的人都会责骂您,并且可能会更好地找到创建共同基础的方法。

【讨论】:

    猜你喜欢
    • 2015-12-26
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    相关资源
    最近更新 更多