我正在构建一个跨平台的移动应用程序,该应用程序的前端是从头开始的。简短的哲学是:
Element
继承。它具有大小,屏幕位置等基本数据结构。Element
的中间人,例如Touchable
,Scrollable
等。来自班级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;
...
};
Element
有std::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
中被删除,则不应在矢量中有效(从矢量中删除它只会暂停其绘图。)
问题是:在这种情况下哪种智能指针类型最适合?或者可能有更好的方法来获得相同的结果?
答案 0 :(得分:1)
所以你的View
是这里的资源管理器,即他们负责根据我想象的交互分配UI元素并在UI的生命周期中删除其中的一些元素。
我不明白为什么/为什么所有元素都存储在班级Element
的矢量中呢?
一般来说,根据我的理解,资源管理器(即Views
)应该创建共享指针,他们可以在它们之间交换我假设(共享所有权),以及&#34;显示&#34; vector(控制绘图的那个)应该存储弱指针。这样,无论何时绘制循环都会在向量上运行,它都可以检查并删除已被破坏的元素。出于这个原因,我还建议不要使用vector
而不是list
,这样您就可以轻松便宜地插入/删除/迭代要绘制的元素。