Наличие «this» в качестве второго параметра в итераторе foreach для производного класса QList

Сначала я хочу прояснить, что это вопрос, основанный на домашнем задании. В таком случае я хочу «понимать», где мои мысли идут наперекосяк, а не просто получить ответ;)

У меня есть класс RegistrationList, производный от QList, например:

class RegistrationList : public QList<Registration *>

Объект Registration имеет два дочерних класса, поэтому список RegistrationList содержит указатели на объекты исходного класса Registration, а также двух его дочерних элементов:

class GuestRegistration : public Registration

и

class StudentRegistration : public Registration

класс RegistrationList должен иметь такой прототип функции:

 void displayList();

Что нужно сделать этой функции, так это вызвать функцию с именем

QString toString();

во всех объектах списка.

Теперь это то, что у меня есть для реализации

 void displayList();

функция-член класса RegistrationList:

void RegistrationList::displayList()
{
    QTextStream cout(stdout);
    cout << "\nHere follows a list of all registrations:";
    cout << "\n=========================================\n";

    foreach(Registration *r, this) { r->toString(); }
}

Но компилятору это совсем не нравится. Я вижу это так: я хочу перебрать список, содержащий коллекцию объектов, подобных регистрации. Каждый из этих объектов имеет функцию-член, называемую

toString();  

распечатать довольно отформатированную информацию. Это работает на 100%. Если я закомментирую строку foreach, код скомпилируется без проблем. Единственное, о чем я могу думать, это то, что foreach не любит иметь

this

как его второй параметр.

Это не обязательно, что я должен использовать foreach, но это будет бесконечно беспокоить меня, если я не смогу выяснить, почему это не работает, хотя «кажется», что так и должно быть...


person Letholdrus    schedule 13.03.2012    source источник
comment
Общее примечание: нет смысла наследовать от контейнера, такого как QList. В нем нет виртуальных методов, которые можно было бы переопределить. Лучше следуйте правилу Composition over Inheritance и сделайте QList членом.   -  person Frank Osterfeld    schedule 14.03.2012


Ответы (2)


foreach требует, чтобы второй аргумент был ссылкой на объект. Поэтому вам необходимо разыменовать это:

foreach(Registration *r, *this) { r->toString(); }

Вы также, вероятно, захотите написать r->toString(); в поток, который вы только что создали.

person mfontanini    schedule 13.03.2012
comment
Фонтанини, спасибо большое! Я изменил его на 'foreach(Registration *r, *this) { cout ‹‹ r->toString(); }' - person Letholdrus; 14.03.2012
comment
Это сработало? Я никогда не использовал foreach, но похоже, что это может заставить его работать. - person mfontanini; 14.03.2012

Я думаю, что вы неправильно реализуете класс (если вам это не было дано явно). Я думаю, что QList должен быть членом класса RegistrationList, а не суперклассом для класса RegistrationList.

Тем не менее, для использования foreach это будет выглядеть так:

foreach(Registration * r, RegList) { r->toString(); } //Where RegList is the QList member of RegistrationList
person clanmjc    schedule 13.03.2012
comment
То, как была дана диаграмма UML, имеет стрелку с пустым наконечником, указывающую от класса RegistrationList к классу QList‹Registration *›. Это означает, что RegistrationList является родителем, верно? Но, если подумать об этом сейчас, на самом деле гораздо больше смысла иметь члена QList. Я только что дважды проверил, и на диаграмме UML нет членов, только функции. Спасибо за помощь и информацию :) - person Letholdrus; 14.03.2012