簡體   English   中英

在C ++中擴展C結構

[英]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 vector2DVector2D的布局是相同的,盡管我可以進行這種簡單的轉換,例如

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM