我正在为Nano-X窗口系统编写一个小部件工具包。在我的基类view
中,我定义了一个向量:
std::vector<RSMKit::View *> children;
在向量中添加或删除项目时是否可以调用函数(在这种情况下为GrReparentWindow
),以便显示新添加的小部件?
答案 0 :(得分:4)
不,这是不可能的。您也不应该将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
。
答案 1 :(得分: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
};
答案 2 :(得分:0)
一种可能的解决方案是对vector类进行子类化,并在插入和删除方法上添加回调。使用stl向量时,默认情况下这是不可能的
答案 3 :(得分:0)
有两种方式;
(1)继承std::vector
并重载push_back()
和pop_back()
方法:
template<typename T>
struct MyVector : std::vector<T>
{
void push_back (const T& x)
{
GrReparentWindow ();
vector<T>::push_back(x);
}
// same way 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());