Поиск определенного элемента в шаблоне Composite

Предположим, у меня есть простая структура составного шаблона:

  • абстрактный класс User

  • лист класса PersonalUser

  • составной класс GroupUser с std::vector<User*> users контейнер как его переменная-член

и метод bool GroupUser::findUser(User* u) который возвращается true если пользователь u находится в users контейнер (который, естественно, состоит из других PersonalUser или же GroupUser объекты)

Теперь я хотел бы определить эту функцию рекурсивно, поэтому мне нужно пройти через каждый User в users вектор и сравнить с u, но я не буду знать, если User это PersonalUser или же GroupUserИтак, мой вопрос:

Должен ли я определить виртуальную функцию char User::returnType() который скажет мне, какой тип User это, или есть лучший / более умный способ спуститься по дереву и искать User?

постскриптум есть конечно метод как bool areEqual(User*, User*) по которым мы можем сравнивать пользователей 🙂

1

Решение

Вы можете добавить функцию-член FindUser как виртуальную к абстрактному классу User и сделать так, чтобы она возвращала значение true, если искомый пользователь является текущим пользователем (Personal или Group).

В GroupUser вы можете переопределить FindUser и делегировать любой вызов всем содержащимся в нем пользователям, если искомый пользователь не является текущим GroupUser.

4

Другие решения

Как сказал MadKeithV, вы объявляете виртуальную функцию findUser (User * u) в интерфейсе,
затем:

bool
User::findUser(User*u) {
return u == this;
}

а также

GroupUser::findUser(User *u) {
for (// loop on your users)
if (currentUser.findUser(u))
return true;
}
}
3

Вы можете использовать, например, dynamic_cast<>() проверить, если User* действительно GroupUser или нет, вот так:

GroupUser* groupUser = dynamic_cast<GroupUser*>(userPointer);

Если он возвращает нулевой указатель, то userPointer это не GroupUser,

1