2015-11-20 10 views
0

Я создаю кросс-платформенное мобильное приложение, которое является интерфейсом, созданным с нуля. Краткая философия такова:Умный выбор указателя для использования пользовательского пользовательского интерфейса

  • Каждый элемент пользовательского интерфейса прямо или косвенно наследует от 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, то не должен быть, действительным в векторе (удаление его из вектора только приостанавливает его рисование).

Вопрос: Какой тип умного указателя подойдет лучше всего в этой ситуации? Или, может быть, есть лучший способ добиться такого же результата?

+0

'shared_ptr <>' и 'weak_ptr <>' – Nim

ответ

1

Таким образом, ваши менеджеры ресурсов здесь, то есть они несут ответственность за выделение элементов интерфейса и удаление некоторых из них за время жизни пользовательского интерфейса в зависимости от взаимодействия, которое я себе представляю.

Я не понимаю, как/почему все элементы хранятся в векторе в классе Element?

В общем, исходя из того, что я понимаю, менеджеры ресурсов (например, Views) должны создавать общие указатели, которые они могут обменивать между собой, я предполагаю (совместное владение) и вектор отображения (тот, который управляет чертежом) должны хранить слабые указатели. Таким образом, всякий раз, когда ваш цикл пробегает вектор, он может проверять и удалять уничтоженные элементы. По этой причине я бы также посоветовал не использовать vector, а скорее list, поэтому вы можете легко и дешево вставлять/удалять/перебирать элементы, которые нужно нарисовать.

Смежные вопросы