2

同じ意味を持つ、2 つの異なるライブラリからの 2 つのクラスがあります。

class A {
public:
    A() {}
    A(const A&) {}
};

class B {
public:
    B() {}
    B(const B&) {}
};

オブジェクトBを渡して、パラメーターとして関数を呼び出したい:A

void setB(const B&) {

}

int main(int argc, char* argv[]) {
    A a;
    setB(a);
}

以下から変換コンストラクターを追加することで、これが可能であることはわかっています。

class B {
public:
    B() {}
    B(const B&) {}
    B(const A&) {} // CANNOT ADD THIS!
};

しかし、これらのクラスは 2 つの外部ライブラリで定義されており、それらを変更する権限がありません。

B クラスの定義に触れずに変換コンストラクターを追加する (または同じ結果を得る) にはどうすればよいですか?

4

3 に答える 3

5

Bクラスに触れずに変換コンストラクターを追加する(または同じ結果を達成する)にはどうすればよいですか?定義?

B クラスに仮想デストラクタがある場合はB、特殊化して特殊化に余分な機能を追加できます。仮想デストラクタがない場合はB、ラッパー クラスに埋め込むことができます。

つまり、次のいずれかです。

class SpecialB: public B { // if B has virtual destructor
public:
    SpecialB(const A&); // you _can_ do this
};

また:

class SpecialB {
public:
    SpecialB(const A&); // you _can_ do this
private:
    B wrapped_b;
};
于 2013-03-28T09:37:48.060 に答える
3

ファクトリを使用するだけです:

 struct AfromB
 {
     static A convert(const B&);
 }

と:

 setB(AfromB::convert(a));
于 2013-03-28T09:35:26.853 に答える
1

クラス定義にアクセスできない場合Bは、オーバーロードを使用する方が簡単かもしれませんvoid setB(const A&)

于 2013-03-28T09:37:06.233 に答える