将构造函数添加到第三方类/结构定义

时间:2011-08-18 12:23:00

标签: c++

第三方库的结构定义为

typedef struct _Example
{
  int member;
} Example;

作为一个侧面问题,出于兴趣,为什么这个定义?为什么不struct Example { ... }

无论如何,我想用boost :: serialization序列化信息,为此需要一个构造函数。通过在结构定义中添加构造函数来更改我的第三方头文件的版本是否安全?或者,只是将该定义复制到我自己的代码库,重命名,添加构造函数,并重新解释为它?

我认为这是因为我理解函数和构造函数不应该更改类/结构的基础字节布局,这是正确的吗?

由于

4 个答案:

答案 0 :(得分:4)

最好从该结构派生并定义您需要的所有构造函数。修改第三方库和复制粘贴定义不是一个好主意。

typedef struct模式来自C.在[较旧的?] C中,struct _Something不允许您将_Something用作类型:

//_Something x;//not allowed
struct _Something x; //ok

使用typedef,可以自然Something x方式定义变量,而不会产生struct负担。

答案 1 :(得分:3)

typedef struct ...来自C而不是C++来使用struct的缩写。是否有可能第三方库是用C语言编写的?

我不建议像你正在尝试使用reinterpret_casts。我建议你创建一个小的包装类来封装Example结构。这样更安全,可以省去很多调试痛苦。

HTH

答案 2 :(得分:1)

你的struct有一个构造函数。编译器为你生成了一个无参数构造函数,这正是boost :: serialization所需要的。

答案 3 :(得分:0)

Why not struct Example { ... } ?

struct Example {...};是您在C ++中定义struct的方式,而typedef形式是旧的C风格。

functions and constructors shouldn't change the underlying byte layout of the 
class/struct

这取决于。函数与文本部分中的数据分开存储。因此,添加普通函数不会影响struct的大小和布局。但是,如果有任何virtual函数,则会在您的班级中添加“隐藏”VPTR。因此,布局可能与没有虚拟函数的布局非常不同。

Is it safe to just change my version of the 3rd party header file by adding a 
constructor to the struct definition? Or alternatively, to just copy that definition
to my own code base, rename it, add a constructor, and reinterpret_cast to it?

我强烈建议您 复制定义。这是一个非常糟糕的主意,特别是当你的第三方课程无法控制时。如果他们有一天改变定义怎么办?有几种方法可以处理它。例如,使用聚合或继承。实际上,在这种情况下,我认为聚合的使用优于。

// The layout of this struct is the same as
// that of struct Example
struct MyExample
{
   Example m_ex;
   MyExample(int member)
   {
      m_ex.member = member;
   }
   //..
};