自定义UI元素用法的智能指针选择

时间:2015-11-20 13:37:10

标签: c++ user-interface pointers c++11

我正在构建一个跨平台的移动应用程序,该应用程序的前端是从头开始的。简短的哲学是:

  • 每个UI元素都直接或间接地从Element继承。它具有大小,屏幕位置等基本数据结构。
  • UI控件可以继承继承Element的中间人,例如TouchableScrollable等。来自班级Element的中介继承是虚拟的。
  • 每个Element后代都可以拥有任意数量的子元素。

示例:

class Touchable : public virtual Element { ... };
class HasText : public virtual Element { ... };

class Button : public Touchable, public HasText { ... };

class LoginView : public Element {
    Button* _btnLogin;
    TextBox* _txtPassword;
    ...
};

Elementstd::vector<???_ptr<Element>>,其中包含所有元素。它的使用方式如下:

LoginView::LoginView(...) {
    _btnLogin = std::make_???<Button>();
    _btnLogin.setText("Login");
    _btnLogin.setFont("Helvetica"); // initialize
    ...
    addSubview(_btnLogin); // add to vector
}

void LoginView::_someOtherFunc() {
    _btnLogin->isVisible = false;  // use some time later
}

在构建视图期间,会创建并初始化Button的新实例,但只有在添加到层次结构(向量)时才会绘制它。 但是可以在以后的任何时候使用(因此unique_ptr是不可能的,因为我必须将它移动到矢量,因此&#34;失去&#34;它的所有权View)。此外,当从矢量中移除对象时,不应将其删除,但如果它在View中被删除,则不应在矢量中有效(从矢量中删除它只会暂停其绘图。)

问题是:在这种情况下哪种智能指针类型最适合?或者可能有更好的方法来获得相同的结果?

1 个答案:

答案 0 :(得分:1)

所以你的View是这里的资源管理器,即他们负责根据我想象的交互分配UI元素并在UI的生命周期中删除其中的一些元素。

我不明白为什么/为什么所有元素都存储在班级Element的矢量中呢?

一般来说,根据我的理解,资源管理器(即Views)应该创建共享指针,他们可以在它们之间交换我假设(共享所有权),以及&#34;显示&#34; vector(控制绘图的那个)应该存储弱指针。这样,无论何时绘制循环都会在向量上运行,它都可以检查并删除已被破坏的元素。出于这个原因,我还建议不要使用vector而不是list,这样您就可以轻松便宜地插入/删除/迭代要绘制的元素。