Создание QList объектов абстрактного класса в C++/QT?
Хотя мне много раз помогли другие вопросы / ответы здесь, это мой первый вопрос здесь, так что не будьте слишком резкими со мной!:)
Я изучал QT/C++ и давайте предположим, что у меня есть что-то вроде этого:
class AbstractMasterClass{
public:
virtual void foo(void) = 0; //Pure virtual method
}
Этот класс будет иметь множество подклассов, каждый из которых реализует свой собственный метод foo(). И вопрос: как я могу создать QList, который я буду заполнять подклассами AbstractMasterClass?
Цель состоит в том, чтобы иметь возможность перебирать список, вызывая метод foo() для каждого элемента, то есть использовать мастер-класс так же, как я делал бы с интерфейсом Java. В результате нескольких попыток я получил несколько ошибок времени компиляции, говорящих о том, что мы не можем выделить объект абстрактного класса (очевидно) при создании QList.
Итак, как я могу это сделать или есть лучший способ сделать Java-подобный интерфейс в C++/QT?
Заранее благодарю всех за то, что уделили время и ответили мне в правильном направлении!
1 ответ
Это общий вопрос C++, а не вопрос Qt. Вы хотели бы использовать полиморфизм в этом случае. Создайте указатель типа AbstractMasterClass и сделайте так, чтобы он указывал на один из ваших производных классов, затем вы сохраните указатели в своем списке. Я использовал QSharedPtr в приведенном ниже примере, чтобы избежать необходимости какого-либо ручного удаления памяти.
class AbstractMasterClass {
public:
virtual ~AbstractMasterClass(){}; // virtual destructor so derived classes can clean up
virtual void foo() = 0;
};
class DerivedA : public AbstractMasterClass {
public:
void foo() { cout << "A\n"; }
};
class DerivedB : public AbstractMasterClass {
public:
void foo() { cout << "B\n"; }
};
int main() {
QList<QSharedPtr<AbstractMasterClass>> myList;
QSharedPtr<AbstractMasterClass> a(new DerivedA());
QSharedPtr<AbstractMasterClass> b(new DerivedB());
myList.push_back(a);
myList.push_back(b);
for (auto &it : myList) {
it->foo();
}
return 0;
}