Наличие 'this' в качестве второго параметра в итераторе foreach для производного класса QList - PullRequest
0 голосов
/ 14 марта 2012

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

У меня есть класс 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, но это не даст мне покоя, если я не смогу понять, почему он не работает, хотя "кажется" так, как будто он должен ...

Ответы [ 2 ]

3 голосов
/ 14 марта 2012

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

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

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

0 голосов
/ 14 марта 2012

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

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

foreach(Registration * r, RegList) { r->toString(); } //Where RegList is the QList member of RegistrationList
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...