1

他のクラスの関数を実行するクラスを作成したいと思います。クラス A と名付けましょう。したがって、この A クラスとクラス A からクラスを継承して、派生クラスから関数アドレスを受け取り、それらを実行できるようにしたいと考えています。

これは私がこれまでに考えたことです:

#include <iostream>
using namespace std;

template <class T>
class A
{
public:
    // a typedef for the function I want to execute 
    // which has no parameters and void as return type
    typedef void (T::*SpecialFunc)();

    A() { }

    //this is the function that executes the received functions
    void exec(SpecialFunc func)
    {
        ((new T)->*func)();
    }
};

class B : public A<B>
{
public:
    B()
    {
        // call A::exec to call my function
        exec(&B::funcB);
    }

    //function I want to be executed
    void funcB()
    {
        cout << "testB\n";
    }
};

int main()
{
    B ob;

    return 0;
}

私が欲しいのは、関数 funcB が呼び出されることです。これまでのところ、私のプログラムはエラーなしで壊れていますが、ひどく壊れています。クラス B からの情報を必要とするクラス A を構築しようとしており、クラス B は最初のクラス A からの情報を構築する必要があるため、このコードが機能しないことはわかっていますが、私が達成したいことをよりよく理解していただければ幸いです。

これは達成できますか?

ありがとうございました

4

2 に答える 2

2

ここには無限再帰があるようです。exec()のコンストラクターで呼び出すと、その呼び出しなどのコンストラクターを呼び出すステートメントBによって新しいBオブジェクトが作成されます。おそらく、その構築を避けるために、オブジェクトへのポンターまたは参照を渡す必要があります。newBexec()Bexec()

もちろん、Bオブジェクトのリークインexec()は見栄えがよくありません。私はそれがテスト目的のためだけであることを願っています...

于 2012-08-31T09:54:30.500 に答える
1

1) 「クラス A はクラス B からの情報を必要とし、クラス B は最初のクラス A からの情報を必要とする」

-循環参照を防止するには、前方宣言を使用します

2)私はあなたのアイデアの次の実装を提案します:

  1. 純粋仮想関数を持つ抽象クラス(クラス Abstr)
  2. 他のクラスはそれを継承 (派生)
  3. クラスマネージャー - 引数抽象クラスとして取得し、任意の派生クラスを提供して、特定のクラスの仮想関数を呼び出すことができます

与えられたアプローチにより、OOP のアイデアをより効率的に使用できるようになると思います

于 2012-08-31T10:02:15.673 に答える