質問
私のプロジェクトでは 2 つの異なるライブラリを使用していますが、どちらも基本的な四角形を提供します。 struct
. 。これの問題は、型間に変換を挿入する方法がないように見えるため、一方のライブラリの関数を、もう一方のライブラリの関数の結果で呼び出すことができないことです。私がこれらのいずれかの作者であれば、コンバージョンを生み出すことができますが、外部からはそれができません。
ライブラリa:
typedef struct rectangle { sint16 x; sint16 y; uint16 w; uint16 h; } rectangle;
ライブラリb:
class Rect {
int x; int y; int width; int height;
/* ... */
};
今ではコンバーターを作ることはできません class
, なぜなら、C++ は 1 ステップでのみ変換を検索するからです。あらゆる種類の新しいオブジェクトの作成に関連する可能性がたくさんあるため、これはおそらく良いことです。
を受け取る演算子を作成できません struct
から a
のオブジェクトを提供します class
から b
:
foo.cpp:123 error: ‘operator b::Rect(const rectangle&)’ must be a nonstatic member function
では、これを回避する賢明な方法はあるのでしょうか?
編集:
私はプログラマーになることを期待していないので、結果をシームレスに操作できるソリューションが本当に欲しいと思っていることも指摘しておきます。(私も同意しますが、昔ながらの明示的な変換は良い選択だったでしょう。もう一方の支店は、 reinterpret_cast
同じ問題があります..)
編集2:
実際のところ、どの提案も私の実際の質問に実際には答えていないのですが、 コンラート・ルドルフ 正しいようです。C++ では実際にはこれを行うことはできません。ひどいですが、本当です。(何か違いがある場合は、提案されているようにサブクラス化を試してみます コーディングザホイール.
解決
構造を変更できない場合、変換演算子のオーバーロードはクラス本体内でのみ機能するため、手動変換関数を作成する以外に方法はありません。他に方法はありません。
他のヒント
中間シムタイプを作成します。RectangleEx
" を定義し、サードパーティの文字列型との間のカスタム変換を定義します。いずれかの API にアクセスするときは、必ず shim クラスを通じて行ってください。
別の方法は、 class
どちらからでも rect
または Rectangle
, 、そこに変換/コンストラクターを挿入します。
これがどれほど賢明なのかはわかりませんが、次のようなものはどうでしょうか。
class R
{
public:
R(const rectangle& r) { ... };
R(const Rect& r) { ... };
operator rectangle() const { return ...; }
operator Rect() const { return ...; }
private:
...
};
次に、すべてをラップするだけです rectangle
で R()
そして「正しいこと」が起こるでしょう。
あなたの場合は実現不可能かもしれませんが、型を互換性を持たせるためにちょっとしたプリプロセッサー foo を使用している人を見てきました。
これでも、一方または両方のライブラリを構築していることを前提としています。
また、これをまったく実行したくないが、早期の決定を再評価したい場合もあります。か否か。
次のような単純なことはどうでしょうか。(これはコンパイルできない可能性があることに注意してください)しかし、アイデアはわかります...
private Rect* convert(const rectangle& src)
{
return new Rect(src.x,src.y,src.w,src.h);
}
int main()
{
rectangle r;
r.x = 1;
r.y = 2;
r.w = 3;
r.h = 4;
Rect* foo = convert(&r);
...
delete foo;
}
編集: kokoさんも私も同じ考えのようです。
もし struct
内部的には同じだったので、次のようにすることができます reinterpret_cast
;ただし、16 ビットと 32 ビットのフィールドがあるように見えるため、呼び出しごとに変換するか、ライブラリの 1 つのすべての関数のラッパーを作成するのに行き詰まっている可能性があります。
演算子のオーバーロードを試してみてはいかがでしょうか?(クラスのメソッドではない = 演算子かもしれません)?
Rect 演算子= (const Rect&,const Rectangle&)
詳細については、Bjarne Stroustrup による C++ プログラミング言語、または次のページを参照してください。 http://www.cs.caltech.edu/courses/cs11/material/cpp/donnie/cpp-ops.html