Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;派生结构以管理不同的版本_C++_Buffer - Fatal编程技术网

C++ c++;派生结构以管理不同的版本

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()

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

版本1的帧有32个浮点数,版本2的帧有48个浮点数,等等

我将文件版本存储在头文件中,我的问题是:

我有以下结构:

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


struct ReplayFrame 
{
    double time;
    float data[212];
    ReplayFrame();
};
当我加载回放时,我将帧放在缓冲区中,但缓冲区是我帧的向量
std::vector frames

很明显,这不起作用,因为当我向后推时,if is not
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;
(有关将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();