наследование и удаление объектов в переполнении стека

У меня есть несколько элементов управления, организованных следующим образом:

deque<wxTextCtrl*> dequeEdit;
deque<wxStaticText*> dequeText;
deque<wxComboBox*> dequeCombo;

Все эти элементы управления наследуются от wxWindow, который имеет метод Show. Я хотел бы показать (или скрыть) целую деку сразу, без необходимости использования нескольких методов для каждой декы. Как это можно сделать?

Я думал о создании deque wxWindow для каждого элемента управления, чтобы я мог написать метод

ShowDeque(deque<wxWindow*> deque)

так что показывать было бы легко, но с другой стороны, если бы я хотел работать, например, с combobox, я должен был бы напечатать это назад к wxComboBox.
Есть ли другие возможности? Благодарю.

1

Решение

Использование:

for_each(dequeEdit.begin(), dequeEdit.end(), mem_fun(&wxWindow::Show));

То же самое для любых других запросов.

Или заключить в одну функцию:

template <class Deque>
void showAll(const Deque& dequeObj)
{
using namespace std;
for_each(dequeObj.begin(), dequeObj.end(), mem_fun(&wxWindow::Show));
}

showAll(dequeEdit);
  1. std::for_each: http://en.cppreference.com/w/cpp/algorithm/for_each
  2. std::mem_fun: http://en.cppreference.com/w/cpp/utility/functional/mem_fn
2

Другие решения

Если это простой метод, сделайте его шаблоном:

template <typename WxT>
void ShowDeque(std::deque<WxT*> &d) { ... }

или лучше использовать итераторы для абстрагирования типа контейнера:

template <typename WxIter>
void ShowDeque(WxIter begin, WxIter end) { ... }

или, что еще лучше, используйте стандартные возможности (Петр опередил меня, пока я печатал!)

1

Вы можете использовать шаблон функции.

template <typename T>
void show_all(const std::deque<T*>& d) {
for (typename std::deque<T*>::iterator it=d.begin(); it!=d.end(); ++it)
(*it)->Show();
}

Затем вы можете вызвать его как обычную функцию.

deque<wxTextCtrl*> dequeEdit;
deque<wxStaticText*> dequeText;
deque<wxComboBox*> dequeCombo;

show_all(dequeEdit);
show_all(dequeText);
show_all(dequeCombo);

С помощью шаблона функции вы можете даже сделать show_all независимо от используемого контейнера, добавив дополнительный аргумент шаблона.

template <typename C, typename T>
void show_all(const C<T*>& d) {
for (typename C<T*>::iterator it=d.begin(); it!=d.end(); ++it)
(*it)->Show();
}

C затем может быть любым контейнером STL или даже любым контейнером, который поддерживает тот же интерфейс итератора.

1
По вопросам рекламы [email protected]