我想解析一些二进制文件。我们可以说该文件只包含file_header和file_content。我们使用YFileHeader和YfileContent来表示它。
对于整个二进制文件,我使用YFile来表示它。
我只关心YFileHeader中的flag1和flag2。这将在YFile中用来做一些复杂的事情。
class YFileHeader {
private:
int flag1;
int flag2;
public:
int getF1() { return flag1; }
int getF2() { return flag2; }
};
class YfileContent {
public:
int len;
char* c;
};
class YFile {
private:
YFileHeader h;
YFileContent c;
public:
int getF1() { return h.getF1(); }
int getF2() { return h.getF2(); }
int yf {
/*
* do some complex things with getF1() and getF2()
*/
return getF1() + getF2();
}
char* getContent() { return c.c; }
};
/*
* YFile* yFile = (YFile*) mmap(....);
* yFile->yf();
* yFile->getContent();
*/
但是文件版本发生了变化,导致文件Header的布局发生了变化,其余的 不
class YFileHeader_v2 {
private:
int flag1;
int foo;
int flag2;
public:
int getF1() { return flag1; }
int getF2() { return flag2; }
};
如何设计YFileHeader和YFile?我认为困难是: 1.可以更改YFileHeader的长度。 2.我们不能使用仅包含一些虚方法的Base类。因为如果是这样,任何派生类都会添加一个vpt成员。