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