Наследование и наследование объектов в 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);
  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

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

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;
        }
Другие вопросы по тегам