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

Adding constructor to third party class/struct definition

本文关键字:定义 添加 构造函数 结构 第三方      更新时间:2023-10-16

第三方库的结构定义为

typedef struct _Example
{
  int member;
} Example;

作为一个附带问题,只是出于兴趣,为什么要这样定义?为什么不是struct Example { ... } ?

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

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

谢谢

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

typedef struct模式来自C. In [older?]C, struct _Something不允许您使用_Something作为类型:

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

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

typedef struct ...是从C而不是C++派生出来的,以便使用struct s的简写。有没有可能第三方库是用C编写的?

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

HTH

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

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;
   }
   //..
};