c ++派生结构来管理不同的版本
c++ derive struct to manage different version
我需要从一个二进制文件中读取一些数据,这个文件包含一些不同大小的数据帧,具体取决于版本。例如:
版本 1 有 32 个浮点数的框架,版本 2 有 48 个浮点数的框架,等等...
我存储在header文件版本,我的问题是:
我有这些结构:
struct ReplayFrame_8
{
float data[116];
ReplayFrame_8();
};
struct ReplayFrame
{
double time;
float data[212];
ReplayFrame();
};
当我加载回放时,我将帧放在缓冲区中,但缓冲区是我的帧的矢量 std::vector<ReplayFrame> frames;
显然这是行不通的,因为当我执行 push_back 时,如果不是 ReplayFrame
就会给我错误..
我该如何解决这个问题?
一个可能的选择:
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;
并插入通过新创建的框架,例如
frames.push_back(new ReplayFrame_8());
(有关将 unique_ptr 推入向量的详细信息,请参阅 Why can I not push_back a unique_ptr into a vector?,但此处似乎没有必要)。
如果您不想在您的 BaseReplayFrame 中包含 frame_type - 也应该可以通过将矢量元素类型设为
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; }
};
frames如上声明,无需强制转换即可访问数据,via
size_t datasz = frames[i]->get_data_size();
float* data = frames[i]->get_data();
可以通过类似的方式添加对时间的访问。
我需要从一个二进制文件中读取一些数据,这个文件包含一些不同大小的数据帧,具体取决于版本。例如:
版本 1 有 32 个浮点数的框架,版本 2 有 48 个浮点数的框架,等等...
我存储在header文件版本,我的问题是:
我有这些结构:
struct ReplayFrame_8
{
float data[116];
ReplayFrame_8();
};
struct ReplayFrame
{
double time;
float data[212];
ReplayFrame();
};
当我加载回放时,我将帧放在缓冲区中,但缓冲区是我的帧的矢量 std::vector<ReplayFrame> frames;
显然这是行不通的,因为当我执行 push_back 时,如果不是 ReplayFrame
就会给我错误..
我该如何解决这个问题?
一个可能的选择:
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;
并插入通过新创建的框架,例如
frames.push_back(new ReplayFrame_8());
(有关将 unique_ptr 推入向量的详细信息,请参阅 Why can I not push_back a unique_ptr into a vector?,但此处似乎没有必要)。
如果您不想在您的 BaseReplayFrame 中包含 frame_type - 也应该可以通过将矢量元素类型设为
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; }
};
frames如上声明,无需强制转换即可访问数据,via
size_t datasz = frames[i]->get_data_size();
float* data = frames[i]->get_data();
可以通过类似的方式添加对时间的访问。