2011-08-18 90 views
2

第三方庫已結構定義爲添加構造第三方類/結構定義

typedef struct _Example 
{ 
    int member; 
} Example; 

作爲一個方面的問題,只是出於興趣,爲什麼定義?爲什麼不是struct Example { ... }

無論如何,我想用boost :: serialization序列化信息,並且需要一個構造函數。通過向結構定義添加一個構造函數來更改我的第三方頭文件的版本是否安全?或者,也可以將該定義複製到我自己的代碼庫中,重命名它,添加構造函數,然後reinterpret_cast給它?

我認爲這是因爲據我瞭解,函數和構造函數不應該改變類/結構的底層字節佈局,這是正確的嗎?

感謝

+1

你確定你需要一個構造函數嗎? –

+0

@Andreas:也許我是誤解,但在[這裏](http://www.boost.org/doc/libs/1_47_0/libs/serialization/example/demo.cpp)是以下評論:_ // every可序列化的類需要constructor_ – Cookie

+2

如果不提供構造函數,編譯器將添加默認值。 –

回答

1

你的結構有一個構造函數。編譯器爲你生成一個無參數構造函數,這正是boost :: serialization所需要的。

3

typedef struct ...C派生並沒有C++使用簡寫爲struct秒。第三方庫是否可以用C編寫?

我不會建議像你嘗試使用reinterpret_casts。我建議你創建一個小包裝類來封裝Example結構。這是比較安全的,可以避免很多調試的麻煩。

HTH

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的尺寸和佈局。但是,如果有任何功能,您的班級中將添加一個「隱藏的」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; 
    } 
    //.. 
}; 
4

最好從該結構派生並定義所需的所有構造函數。修改第三方庫和複製粘貼定義不是一個好主意。

typedef struct模式來自C.在[?年長] C,struct _Something不允許使用_Something作爲類型:

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

用typedef,可以定義自然Something x方式的變量,而沒有struct負擔。