Nano-Xウィンドウシステム用のウィジェットキットを作成しています。私の基本クラスview
では、私は、ベクトルが定義されている:アイテムがベクターに追加または削除されたときの呼び出し関数
std::vector<RSMKit::View *> children;
が新しく追加されたウィジェットができるように項目がベクターから追加または削除されている場合(この場合はGrReparentWindow
)関数を呼び出すことは可能です表示されますか?
Nano-Xウィンドウシステム用のウィジェットキットを作成しています。私の基本クラスview
では、私は、ベクトルが定義されている:アイテムがベクターに追加または削除されたときの呼び出し関数
std::vector<RSMKit::View *> children;
が新しく追加されたウィジェットができるように項目がベクターから追加または削除されている場合(この場合はGrReparentWindow
)関数を呼び出すことは可能です表示されますか?
号は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
};
可能な解決策の1つは、ベクタークラスをサブクラス化し、挿入メソッドと削除メソッドでコールバックを追加することです。 stlベクトルではこれはデフォルトでは不可能です
いいえ、これはできません。 std::vector
をサブクラス化して、push_back
とerase
を上書きすることはできません。これは、そのクラスが設計されていないためです。ただし、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
を使用して、より複雑なコールバックをしたいと思います。
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());
標準コンテナはサブクラス化されていません。 – 6502