0

プロジェクトで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つのステップでのみ変換を検索するため、コンバーターを作成できません。あらゆる種類の新しいオブジェクトを作成することを含む多くの可能性があるので、これはおそらく良いことです。

fromを取得し、 structfromaのオブジェクトを提供する演算子を作成できません:classb

foo.cpp:123エラー:'演算子b:: Rect(constrectangle&)'は非静的メンバー関数である必要があります

それで、これを回避する賢明な方法はありますか?

編集:

私はそのコーダーになることを期待していないので、結果をシームレスに処理できるソリューションが本当に必要であることも指摘しておく必要があります。(私は同意しますが、昔ながらの明示的な変換は良い選択でした。他のブランチにreinterpret_castも同じ問題があります。)

edit2:

実際、私の実際の質問に実際に答える提案はありません。コンラッド・ルドルフは正しいようです。C++は実際にはこれを行うことができません。吸いますが、本当です。(違いがある場合は、CodingTheWheelで提案されているようにサブクラス化を試してみます。

4

7 に答える 7

4

中間シム型 " RectangleEx" を作成し、サードパーティの文字列型との間のカスタム変換を定義します。いずれかの API と話すときはいつでも、shim クラスを介して行います。

別の方法は、またはclassからa を派生させ、そこに変換/コンストラクターを挿入することです。rectRectangle

于 2008-08-26T14:44:41.257 に答える
3

これがどれほど賢明かはわかりませんが、次のようなものはどうでしょうか。

class R
{
public:
    R(const rectangle& r) { ... };
    R(const Rect& r) { ... };

    operator rectangle() const { return ...; }
    operator Rect() const { return ...; }

private:
    ...
};

rectangle次に、すべてをラップするだけR()で、「正しいこと」が起こります。

于 2008-08-26T14:49:01.057 に答える
2

構造を変更できない場合、変換演算子のオーバーロードはクラス本体内でのみ機能するため、手動の変換関数を作成する以外に方法はありません。他に方法はありません。

于 2008-08-26T14:48:00.420 に答える
0

あなたの場合は実行可能ではないかもしれませんが、人々が小さなプリプロセッサ-fooを使用してタイプを互換性にマッサージするのを見てきました。

これでも、一方または両方のライブラリを構築していることを前提としています。

これをまったく行いたくないが、初期の決定を再評価したい場合もあります。か否か。

于 2008-08-26T14:37:28.167 に答える
0

が内部的に同じである場合は、 ;structを実行できます。reinterpret_castただし、16ビットフィールドと32ビットフィールドがあるように見えるため、呼び出しごとに変換したり、いずれかのライブラリのすべての関数のラッパーを記述したりするのに行き詰まっている可能性があります。

于 2008-08-26T14:38:11.800 に答える
0

次のような単純なものではないのはなぜですか: (これはおそらく/おそらくコンパイルされないことに注意してください)しかし、あなたはアイデアを得る...


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;

}

編集:ココのように見えるし、私は同じ考えを持っています.

于 2008-08-26T14:41:26.380 に答える
-1

多分あなたは演算子のオーバーロードでそれを試すことができますか? (おそらく、クラスのメソッドではない = 演算子) ?

Rect operator= (const Rect&,const Rectangle&)

これについては、Bjarne Stroustrup による C++ プログラミング言語またはこのページで詳しく説明しています: http://www.cs.caltech.edu/courses/cs11/material/cpp/donnie/cpp-ops.html

于 2008-08-26T14:44:27.200 に答える