c ++派生结构来管理不同的版本

时间:2015-06-04 15:35:53

标签: c++ buffer

我需要从二进制文件中读取一些数据,这个文件包含一些不同大小的数据帧,具体取决于版本。例如:

版本1的框架为32个浮动,版本2的框架为48,等等...

我在标题中存储了文件版本,我的问题是:

我有这些结构:

struct ReplayFrame_8
{
    float data[116];
    ReplayFrame_8();
};


struct ReplayFrame 
{
    double time;
    float data[212];
    ReplayFrame();
};

当我加载重放时,我将帧放在缓冲区中,但缓冲区是我的帧的矢量std::vector<ReplayFrame> frames;

显然这不起作用,因为当我执行push_back时,如果不是ReplayFrame则给我错误..

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

一种可能的选择:

struct BaseReplayFrame {
  int frame_type;

  BaseReplayFrame(int ft ) {
    frame_type = ft;
  }
};

struct ReplayFrame_8 : public BaseReplayFrame {
  float data[116];
  ReplayFrame_8() : BaseReplyFrame(8) {
    //...
  }
};

struct ReplayFrame : public BaseReplayFrame {
  double time;
  float data[212];
  ReplayFrame():BaseReplayFrame(0): {
  }
};

然后,您可以将矢量声明为

std::vector<unique_ptr<BaseReplayFrame>> frames;

并插入通过new创建的框架,例如

frames.push_back(new ReplayFrame_8());

(有关将unique_ptr推送到向量中的详细信息,请参阅Why can I not push_back a unique_ptr into a vector?,但此处似乎没有必要)。

如果您不想在BaseReplayFrame中使用frame_type - 也可以通过将vector元素类型设置为

来实现
pair<int,unique_ptr<BaseReplayFrame>>

,虽然它可能会更麻烦。

编辑:如果非空的BaseReplayFrame可以,则更好的选择:

struct BaseReplayFrame {
  virtual float* get_data() = 0;
  virtual size_t get_data_size() = 0;
};

struct ReplayFrame_8 : public BaseReplayFrame {
  float data[116];
  virtual float* get_data() { return data; }
  virtual size_t get_data_size() { return 116; }
};

struct ReplayFrame : public BaseReplayFrame {
  double time;
  float data[212];
  virtual float* get_data() { return data; }
  virtual size_t get_data_size() { return 212; }
};

帧声明如上,并且无需强制转换即可通过

访问数据
size_t datasz = frames[i]->get_data_size();
float* data = frames[i]->get_data();

可以以类似的方式添加时间访问。