C++ c++;派生结构以管理不同的版本
我需要从二进制文件中读取一些数据,该文件包含一些大小不同的数据帧,具体取决于版本。例如: 版本1的帧有32个浮点数,版本2的帧有48个浮点数,等等 我将文件版本存储在头文件中,我的问题是: 我有以下结构:C++ c++;派生结构以管理不同的版本,c++,buffer,C++,Buffer,我需要从二进制文件中读取一些数据,该文件包含一些大小不同的数据帧,具体取决于版本。例如: 版本1的帧有32个浮点数,版本2的帧有48个浮点数,等等 我将文件版本存储在头文件中,我的问题是: 我有以下结构: struct ReplayFrame_8 { float data[116]; ReplayFrame_8(); }; struct ReplayFrame { double time; float data[212]; ReplayFrame()
struct ReplayFrame_8
{
float data[116];
ReplayFrame_8();
};
struct ReplayFrame
{
double time;
float data[212];
ReplayFrame();
};
当我加载回放时,我将帧放在缓冲区中,但缓冲区是我帧的向量std::vector frames代码>
很明显,这不起作用,因为当我向后推时,if is notReplayFrame
会给出错误
如何解决此问题???一个可能的选项:
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;
(有关将unique_ptr推入向量的详细信息,请参阅,但这里似乎没有必要)
如果您不想在BaseReplayFrame中使用frame_类型,那么也可以使用向量元素类型,如
pair<int,unique_ptr<BaseReplayFrame>>
帧的声明如上所述,通过
size_t datasz = frames[i]->get_data_size();
float* data = frames[i]->get_data();
可以以类似的方式添加对时间的访问。为什么要使用新的
表达式std::move
-谢谢,但是要使用浮点数组?如果不在基is not storedIt stored中,只需将其强制转换为基于帧类型的正确指针,或添加虚拟get_data()=0;到BaseReplyFrame,并在每个派生ReplyFrame类中将其重写为虚拟get_data(){return data;}谢谢@No BugsHare,所以如果我作为基类型推送,并且当我使用我强制转换为派生类型时,它会工作吗?我试试看!:)将其创建为派生类型(在堆上),存储为指向基类型的指针,并将其用作指向派生类型的指针。它的作用是存储和转换指针,而不会更改指向的类型。
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();