2011-07-24 11 views
1

Nano-Xウィンドウシステム用のウィジェットキットを作成しています。私の基本クラスviewでは、私は、ベクトルが定義されている:アイテムがベクターに追加または削除されたときの呼び出し関数

std::vector<RSMKit::View *> children; 

が新しく追加されたウィジェットができるように項目がベクターから追加または削除されている場合(この場合はGrReparentWindow)関数を呼び出すことは可能です表示されますか?

答えて

1

号はstd::vectorから継承しません。ちょうどカプセル化してください。

template<typename T> struct MyVector 
{ 
private: 
    std::vector<T> items; 
public: 
    void push_back (const T& x) 
    { 
     // Do something here 
     items.push_back(x); 
    } 
    // etc 
}; 
0

可能な解決策の1つは、ベクタークラスをサブクラス化し、挿入メソッドと削除メソッドでコールバックを追加することです。 stlベクトルではこれはデフォルトでは不可能です

+3

標準コンテナはサブクラス化されていません。 – 6502

4

いいえ、これはできません。 std::vectorをサブクラス化して、push_backeraseを上書きすることはできません。これは、そのクラスが設計されていないためです。ただし、std::vectorを使用して格納する独自のコンテナを作成し、AddおよびRemove関数をコールバックで公開するのは簡単です。以下の線に沿って何か:実際には

template<typename T> 
class CallbackVector 
{ 
public: 

    typedef void (*Callback)(); 

private: 

    std::vector<T> elements; 
    Callback  OnAdd; 
    Callback  OnRemove; 

public: 

    CallbackVector(Callback OnAdd, Callback OnRemove) 
     : OnAdd (OnAdd) 
     , OnRemove (OnRemove) 
    { 
    } 

    void Add(const T & element) 
    { 
     elements.push_back(element); 
     OnAdd(); 
    } 

    void Remove(int i) 
    { 
     elements.erase(elements.begin() + i); 
     OnRemove(); 
    } 
}; 

は、おそらくポインタのパラメータを持つ関数を使用するか、boost::functionを使用して、より複雑なコールバックをしたいと思います。

+0

関数ポインタのコールバック? Owch。 – Puppy

+0

例のために最も簡単です。他のコールバック実装には長所と短所があります。 –

+0

引数なしのフリー関数で何が実現できるのでしょうか?基本的にはグローバル変数を使用してコールバック内の何かを実際に行うようにしています。それは契約を破る詐欺だ。 'boost :: function'は宇宙で最速のものではないかもしれませんが、"信じられないほど悪い、デザインを破壊する "というスキームのグローバル変数からは遠いです。 – Puppy

0

2つの方法があります。使用

template<typename T> 
struct MyVector : std::vector<T> 
{ 
    void push_back (const T& x) 
    { 
    GrReparentWindow(); 
    vector<T>::push_back(x); 
    } 
    // same way pop_back() 
}; 

(1)std::vector過負荷push_back()pop_back()メソッドを継承

MyVector<RSMKit::View*> children; 
children.push_back(new RSMKint::View); 

(2)もう一つの方法は、push_backにカスタムオーバーロードオペレータまたは方法とアイテムです。あなたがRSMKit::View

class RSMKit::View 
{ 
//... 
public: 
    RSMKit::View* get() 
    { 
    GrReparentWindow(); 
    return this; 
    } 
}; 

を編集することが許可されている場合は使用方法:

MyVector<RSMKit::View*> children; 
RSMKit::View *p = new RSMKint::View; 
children.push_back(p->get()); 
関連する問題