[英]Extend C struct in C++
我有一些C結構,我想在C ++中“擴展”以增加一些便利性和類型安全性。 例如,假設我的結構是
struct vector2D { float x, y; };
從許多資料中,我收集到了在C ++中扭曲此結構的最安全方法是對其進行子類化:
struct Vector2D: vector2D { ... };
到現在為止還挺好。 但是,我在弄清楚如何將C結構重新解釋為擴展版本時遇到了困難。 假設我有一個C函數
struct vector2D do_some_stuff(struct vector2D _a, struct vector2D _b) {
...
}
在此函數中,我想使用C ++表示形式。 由於struct vector2D
和Vector2D
的布局是相同的,盡管我可以進行這種簡單的轉換,例如
Vector2D a = static_cast<Vector2D>(_a)
但這似乎不起作用。 使用構造函數會生成可怕的樣板代碼。
如果可能的話,正確的做法是什么?
澄清: do_some_stuff
是C函數,只能從C代碼中調用。
優先考慮組成而不是繼承。 那就是將您的C ++ class Vector2D
為包含C struct vector2D
的實例並struct vector2D
接口:
class Vector2D {
vector2D p;
public:
vector2D& getP() { return p; }
vector2D const& getP() const { return p; }
float& x() { return p.x; }
float& y() { return p.y; }
float const& x() const { return p.x; }
float const& y() const { return p.y; }
// ...
};
然后將C函數調用為:
Vector2D v1;
Vector2D v2;
...
auto p = do_some_stuff(v1.getP(), v2.getP());
但是,我在弄清楚如何將C結構重新解釋為擴展版本時遇到了困難。
嗯,繼承不是這樣的:子類是母類的一種專業,因此您可以將Vector2D
解釋為vector2d
,而不是相反。
考慮一下:如果擴展的數據最初不在那兒,那么它應該從哪里來呢?
您可以做的是實現一個構造器或vector2d
轉換運算符,該構造函數或構造運算符使用vector2d
來初始化新的Vector2D
。
除此之外,我會說您的整個工作值得懷疑,因為它是基於一種誤解:您要擴展的結構現在是C ++類,與C類型不同。
經過一些試驗,我找到了解決方法:
Vector2D v = *reinterpret_cast<Vector2D*>(&_v);
但是juanchopanza建議使用非成員函數可能是更好的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.