Наследование и наследование объектов в C++
У меня есть несколько элементов управления, организованных следующим образом:
deque<wxTextCtrl*> dequeEdit;
deque<wxStaticText*> dequeText;
deque<wxComboBox*> dequeCombo;
Все эти элементы управления наследуются от wxWindow, который имеет метод Show. Я хотел бы показать (или скрыть) целую деку сразу, без необходимости использования нескольких методов для каждой декы. Как это можно сделать?
Я думал о создании deque wxWindow для каждого элемента управления, чтобы я мог написать метод
ShowDeque(deque<wxWindow*> deque)
так что показывать было бы легко, но, с другой стороны, если бы я хотел поработать, например, со списком, я бы набрал его обратно в wxComboBox. Есть ли другие возможности? Благодарю.
4 ответа
Использование:
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);
std::for_each
: http://en.cppreference.com/w/cpp/algorithm/for_eachstd::mem_fun
: http://en.cppreference.com/w/cpp/utility/functional/mem_fn
Вы можете использовать шаблон функции.
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 или даже любым контейнером, который поддерживает тот же интерфейс итератора.
Если это простой метод, сделайте его шаблоном:
template <typename WxT>
void ShowDeque(std::deque<WxT*> &d) { ... }
или лучше использовать итераторы для абстрагирования типа контейнера:
template <typename WxIter>
void ShowDeque(WxIter begin, WxIter end) { ... }
или, что еще лучше, используйте стандартные возможности (Петр опередил меня, пока я печатал!)
Я столкнулся с этим вопросом, когда искал, как использовать наследование итераторов и деков. Ответ не дает полного ответа, связанного с наследованием, поэтому я добавлю следующее:
Допустим, у вас есть класс, и вы хотите, чтобы этот класс имел возможность иметь двухстороннюю очередь внутри, другими словами, чтобы наследовать способность управлять контейнером двухсторонней очереди.
Пример :
template<typename ElementType>
class myQueOfElements : public deque<ElementType>
{
ElementType placeholder;
myQueOfElements& operator=(unsigned char* rvalue)
{
unsigned char* ptrToNextElement = (unsigned char*)rvalue;
placeholder = ptrToNextElement; // make sure ElementType has its own assignment operator=
push_back(placeholder); // First element
//TODO: Iterate thru the binary and push_back the fetched elements
return *this;
}
};
// Как использовать:
myQueOfElements<myElementTypeClass> testQue;
testQue = (unsigned char*)&blob[0]; // address to binary data, will be parsed in the assignment operator=
// make sure it has same structure as the ElementType (myElementTypeClass)
// fetch all myElementTypeClass object(s) from the myQueOfElements
for (auto e : testQue) {
std::string strName = e.Name;
std::out << "Element : " << strName.c_str() << endl;
}