Я создаю кросс-платформенное мобильное приложение, которое является интерфейсом, созданным с нуля. Краткая философия такова:Умный выбор указателя для использования пользовательского пользовательского интерфейса
- Каждый элемент пользовательского интерфейса прямо или косвенно наследует от
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
не может быть и речи, так как мне пришлось бы переместить его на вектор, таким образом, «потеряв» свою собственность в View
). Также, когда объект удаляется из вектора, его не следует удалять, но если он удаляется в View
, то не должен быть, действительным в векторе (удаление его из вектора только приостанавливает его рисование).
Вопрос: Какой тип умного указателя подойдет лучше всего в этой ситуации? Или, может быть, есть лучший способ добиться такого же результата?
'shared_ptr <>' и 'weak_ptr <>' – Nim