2

私は持っている

  class Wrapper : Base
{
Wrapper(WrappedObject& obj)
//...
};

void fun(Base& b);

funインスタンスで直接呼び出せるようにしたいのですWrappedObjectが、そのような暗黙的な変換は可能ですか? どうやって?

edit : http://ideone.com/ilfE8まだこの例を機能させることができません。何を変更する必要がありますか? ありがとう

4

2 に答える 2

6

継承を公開します。

class Wrapper : public Base

そのままでは、それはis-a関係ではありません。private継承 (クラスのデフォルト) はhas-a関係を表します。

class Wrapper : Base

と同等です

class Wrapper : private Base

編集: コメントによると、一時的なものが作成されるため、参照は const である必要があります。

于 2012-09-28T14:41:21.877 に答える
4

fun非 const 参照によってパラメーターを実際に取得する必要がある場合、これを 1 つのステップで実行することはできません。その理由は、呼び出すにはからfun一時を作成する必要があるためですが、この一時を非 const 参照にバインドすることはできません。WrapperWrappedObject

funパラメータを const 参照として使用できる場合は、継承を他の回答に見られるように変更し、 make のパラメータを const にするだけpublicですfun。その後、あなたが求めたことを正確に行うことができます。

fun非 const 参照によってパラメーターを取得する必要がある場合は、名前付きの一時オブジェクトを作成して渡す必要があります

Wrapper wrap(wrapped_obj);
fun(wrap);

最後に、暗黙のコンストラクターは便利ですが、多くの場合、コードの理解を妨げ、見つけにくいバグにつながる可能性があることに注意してください。コードを 1 回だけ記述し、(暗黙的な変換コンストラクターではなく) 変換を明示的に記述すると、コードが読みやすくなり、バグがより明確になることに注意してください。

編集: さらに調べてみると、C++ で元の目標を達成できるとは思えません。(残念ながら)ルールにより、複数の暗黙的なステップ (construct temp Wrapper、暗黙的なキャスト to Base) を使用して関数を呼び出すことはできません。あなたはそれを助けなければならないでしょう。

おそらく最も簡単な方法はオーバーロードですが、別の方法は、それ自体への呼び出しでfun(const Wrapper& w) { fun(static_cast<const Base&>(w)); }一時オブジェクトを明示的に作成することです。これには、将来の読者にとってもう少し明示的であるという利点があります。Wrapperfun

于 2012-09-28T14:49:47.020 に答える