gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:26:00 27 4
gpt4 key购买 nike

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

版本 1 的框架有 32 个 float ,版本 2 的框架有 48 个,等等......

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

我有这些结构:

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


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

当我加载回放时,我将帧放在缓冲区中,但缓冲区是我的帧的 vector 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): {
}
};

然后,您可以将 vector 声明为

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

然后插入通过 new 创建的框架,比如

frames.push_back(new ReplayFrame_8());

(有关将 unique_ptr 插入 vector 的详细信息,请参阅 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; }
};

frames 声明如上,无需转换即可访问数据,通过

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

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

关于c++派生结构来管理不同的版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30648200/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com