2016-12-14 18 views
0

私はC++を初めて使用しており、次の設計を実現しようとしています。C++の派生クラスの引数として親クラスの参照を渡す

class A { do(); doMore(); } // abstract 
class B { do(); doMore(); } // abstract 

class X : public A, public B // Also abstract 
{   
    foo() { 
     // common code 
     A::do(); 
     A::doMore(); 
    } 
    bar() { 
     // common code 
     B::do(); 
     B::doMore(); 
    } 
} 

AとBの両方がdo()doMore()の実装を提供します。 新しい関数が、正しい親クラスのメソッドを呼び出すargをとる共通コードを抽出するにはどうすればよいですか?

X::newMethod(arg_that_indicates_parent_class) { 
    // common code 
    arg_that_indicates_parent_class::do(); 
    arg_that_indicates_parent_class::doMore(); 
} 

よう

何かがその後、実行時ポリモーフィズムのように見えますが、ではないそれほど

newMethod(pass_A_somehow); 
newMethod(pass_B_somehow); 

のようにそれを呼び出す(またはそれがある?)...それは子クラス内にあるとして。 ..

このデザイン自体はゴミ箱になっていますか?これを実現するにはより良い方法がありますか?

答えて

2

dodoMoreABの両方に存在し、それらが機能は、特に呼び出したい、あなたは そうのようなテンプレート機能を使用できます。

class X : public A, public B // Also abstract 
{   
    template <typename T> 
    void newMethod() 
    { 
     T::do(); 
     T::doMore(); 
    } 
} 

その後、明示的にそれを使用して、あなたがそのようにようにそれを行うことができます:

X x; 
x.newMethod<A>(); 
x.newMethod<B>(); 

をこれには追加の利点を持っていますコンパイル時にいくつかのエラーをキャッチするの、それはあなたがしようと合格した場合C、それが定義され dodoMore機能を持っていない、である、あなたが(代わりに、実行時のコンパイラエラーが発生しますクラッシュ)。

これにより、C++ 1xを使用している場合は、std::enable_if機能を利用することもできます。

希望に応じることができます。

1

ただ、一般的な、よく、「共通のコードを」アウト因子、およびそれを作る:

class X : public A, public B // Also abstract 
{   
    void foo() { 
     commoncode(); 
     A::do(); 
     A::doMore(); 
    } 
    void bar() { 
     commoncode(); 
     B::do(); 
     B::doMore(); 
    } 

    void commoncode() 
    { 
     // Your common code 
    } 
} 

最も簡単な、簡単な方法だこと。どちらか

&X::call_a 

または

&X::call_b 
だろう

class X : public A, public B // Also abstract 
{   
    void call_a() 
     A::do(); 
     A::doMore(); 
    } 
    void call_b() 
     B::do(); 
     B::doMore(); 
    } 

    void commoncode(void (X::*ptr)()) 
    { 
     // Your common code 

     (this->*ptr)(); 
    } 
} 

そしてcommoncode()にパラメータ:もう一つの別の方法は、近いラインであなたの「私にいくつかの種類のポインタを渡し、」意図的なアプローチになります

+0

'common code()'は、おそらくそれを置く最良の方法ではありませんでした。私はちょうど簡潔にするためにそれを置く。共通コードは、実際には 'do()'と 'doMore()'の呼び出しの周りにあります。あなたの2番目の提案は有望に見えます。私はそれをショットを与えるよ! – user2624119

関連する問題