代码之家  ›  专栏  ›  技术社区  ›  PeterK

储存各种大小不同的结构的好方法?

  •  2
  • PeterK  · 技术社区  · 14 年前

    标题有点混乱,所以我将用更多的例子来解释。注意:我正在解析一个文件格式。假设我们有这样一个结构:

    struct example
    {
       typeA a;
       typeB b;
       typeX x;
       typeY y;
       typeZ z;
    };
    

    typeX , typeY typeZ 大小不一。根据文件头(元数据)中的标志,它们可以是两个或四个字节大。另一件事是,还有几个类似的结构(大约40个)。他们每个人都使用 类型X , 类型Y , . 有的全是,有的只有一两个。最后,它们中的大多数是可选的,所以可能只使用了四个或五个结构,或者20个或30个。。。

    我想知道是否有人知道如何存储这样一组不同的数据。我想过使用模板,但不知道它是否正确的方式。

    2 回复  |  直到 14 年前
        1
  •  2
  •   djna    14 年前

    对我来说,问题不在于分配一些空间,在概念上我们可以这样做:

    byte *pA = new byte[the size this time];
    

    而是你如何处理这些typeA对象。是什么

    pA->getValue()
    

    返回?它总是,比如说,一个32位的数字吗?或者我们真的有

    pA->get16bitValue()
    

    在某些情况下

    pA->get32bitValue()
    

    我首先会寻找一种方法来封装这种差异,而这种方法在很大程度上取决于如何使用这些值。存储问题可能可以通过一点动态分配来解决。我认为这是真正的A型beahviour。

        2
  •  1
  •   Ian Goldby    14 年前

    intVal = (buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3];
    

    因此,将文件直接读入结构可能不是一个好主意。

    您应该真正地将文件视为一个流(即它是什么),并定义流操作,以便将数据一次一项地传输到内部内存结构中。

    如果您接受这一点,那么文件格式将与内部内存结构分离。然后,您可以按自己的喜好在内部存储数据。在您的例子中,它听起来像是多态性的理想应用程序。您可以为typeX/Y/Z的每个变量声明一个子类,也可以使用单个类,让它在其构造函数中分配可变的内存量。这完全取决于你的情况。关键是将文件格式与内部内存结构解耦。