2011-01-30 7 views
1

だからこのような構造体を型付きのクラス/関数に変換できますか?

struct RenderCastedDataFunctor 
{ 
    simpleRendererGraphElement* obj_; 

    RenderCastedDataFunctor(simpleRendererGraphElement* obj) 
     : obj_(obj) { } 

    void operator()(char* castedChar, int castedCharLength) 
    { 
     obj_->renderCastedData(castedChar, castedCharLength); 
    } 
}; 

のような構造では、我々はあまりにも構造(renderCastedData)抽象的に使用する抽象型に* simpleRendererGraphElementをオンにし、その関数名を作ることができますか?

だから私は、私はそれに渡したいcharGeneratorクラス

template <typename Function> 
void AddSubscriberToGeneratedData(Function f) 

内部の機能は私がデータにrenderCastedDataと呼ばれる関数を登録することができますいくつかのsimpleRendererGraphElement内部にその構造によりtype void (differentClass::*)(char*, int)

の異なるクラスから機能してい私はにchar*intを取る抽象クラスの機能を渡すことができるようにする方法を持ってしたい charGenerator->AddSubscriberToGeneratedData(RenderCastedDataFunctor(this)); 。そんなことをする方法?

+0

私の答えの編集を参照してください。 – Nawaz

答えて

2

我々は 抽象型に* simpleRendererGraphElementを回し、我々はあまりにも構造 (renderCastedData)抽象的に使用し、その機能 名前を作ることができますか?

非常に非常に良いアイデア。あなたはこれを行うべきです。それは機能virtualだことによって、クラスの抽象を行い、その後、仮想関数を実装します(この抽象クラスから派生する)具象クラスを定義します。それはより良いデザインになります!

、残りはすでに罰金です。あなたはこれをやっているように、何もする必要はありません。

AddSubscriberToGeneratedData(RenderCastedDataFunctor(this)); 

私が思う、ここthisは、具体的なクラスのインスタンスへのポインタを表します。もしそうなら、それはうまくいくはずです!


EDIT:

私はそれを実装する方法を得ることはありません このアイデアはどのように良い理解してますが。その が私が求めている理由です。

いいえ。次に例を示します。

class AbstractGraphElement 
{ 
    public: 
    virtual void RenderCastedData(char* castedChar, int castedCharLength) = 0; 
}; 

これはあなたの抽象クラスであり、そしてRenderCastedDataは純粋仮想関数です。今度は、RenderCastedDataの機能を定義しなければならない具体的なクラスを定義する必要があります。だからここにある:

class SimpleGraphElement : public AbstractGraphElement 
{ 
    public: 
    virtual void RenderCastedData(char* castedChar, int castedCharLength) 
    { 
     //function body - define it yourself 
    } 
}; 

完了!

ここで必要なのはこれです。次のようRenderCastedDataFunctorを変更します。

struct RenderCastedDataFunctor 
{ 
    AbstractGraphElement* m_graphElement; 

    RenderCastedDataFunctor(AbstractGraphElement* graphElement) 
     : m_graphElement(graphElement) { } 

    void operator()(char* castedChar, int castedCharLength) 
    { 
     m_graphElement->RenderCastedData(castedChar, castedCharLength); 
    } 
}; 

その後、私はそれが正しい、あなたのいくつかのアイデアを与えたと思いますが、

AbstractGraphElement *pGraphElement = new SimpleGraphElement(); 
AddSubscriberToGeneratedData(RenderCastedDataFunctor(pGraphElement)); 

を加入者を追加しますか?重要な点は、タイプAbstractGraphElementのポインタを使用しますが、このポインタをSimpleGraphElementで初期化します。私は、仮想関数と実行時の多形性について読むべきだと思います。それはあなたをたくさん助けます。

+0

私はこのアイデアがどれほど優れているか理解していますが、実装方法はわかりません。それが私が求めている理由です。 – Rella

+0

@Kabumbus:編集を参照してください。 :-) – Nawaz

関連する問題