0
class A {
 void methodToCall() {};
}

class B {
 B() {
   subscribeToEvent();
 }
 void eventHandler(Event* E) {
   call A::methodToCall()
 }
}

class C : public A, public B{
}  

これはまれな状況のように思われるかもしれませんので、私がやろうとしていることを説明させてください。

クラスAのようなクラスがたくさんあります。これらは別のフレームワークによって生成されるため、生成方法を制御できません。

すべてのクラスに対して、AIにはAのようなクラスを継承する1つ以上のクラスCがあります。

eventHandler()が呼び出されたときにA :: MethodToCall()を呼び出す必要性を開発しました。私の目標は、クラスCのような私のすべてのクラスでeventhadlerメソッドをサブスクライブして提供する必要がないことです。

私はむしろ、すべてのクラスCが単純に継承できる1つのクラスBを作成したいと思います。

私の問題は、クラスBからクラスAを呼び出す方法がわからないことです。

これを行うためのより良い方法があれば、私はそれを受け入れます。

4

3 に答える 3

1

あなたのコードはあなたの説明と一致しません(コードではBはAから継承しませんが、あなたの説明では継承します)、しかしあなたが言っていることは「私はAのようなクラスをたくさん持っていて、 A(あなたの例ではC)のようなクラスから継承するクラスの数、そして私が除外したいそれらのサブクラス(あなたの例ではBに)にたくさんの一般的なものがありますが、それは特定のものに依存するものを含みますA(あなたの例ではAメソッドを呼び出します)そしてそれは多くのB(各Aに1つ)をほとんどすべて同じにする必要があるという点全体を打ち負かします。」

使用できるものの1つは、「引数から継承するテンプレートクラス」のトリックで、多数のBバリアントを単一のテンプレートクラスとして定義することです。

template<class A> B : public A {
    void eventHandler(Event* E) {
       call methodToCall(); 
    }
}

class C1 : public B<A1> {
     ... whatever

class C2 : public B<A2> { ...

Bでわずかに異なるものを必要とする特定のAクラスがある場合は、それらのクラス用にBテンプレートを特殊化することもできます。

于 2012-12-18T21:03:34.507 に答える
0

AとBのサブクラスであるラッパークラスを作成できます。サブクラスはDと呼ばれ、AとBの両方を認識します。したがって、イベントが発生すると、Dがそれを処理してAを呼び出す責任があります。クラスCにクラスDを継承させる。

編集:私はここであなたの質問を誤解したと思います。BがAを継承する場合、BはAの関数を直接呼び出すことができます(Aのメソッドがプライベートでない限り。プライベートである場合、とにかく呼び出すことはできません)。

于 2012-12-18T20:48:59.693 に答える
0

このコード

class A {
 void methodToCall() {};
}

する必要があります

class A {
 static void methodToCall() {};
}

これが機能するために:

 void eventHandler(Event* E) {
   A::methodToCall()
 }

タイプのオブジェクトがなくA、「B」は何も知らないAため、静的メソッドのみが使用可能になります。

または、これを行います

class B : public A ....
class C: public B

その場合、BはAを継承しているため、静的は必要ありません。

選択はあなた次第です。

于 2012-12-18T20:56:00.937 に答える