Предположим, у меня есть простая структура составного шаблона:
абстрактный класс 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*)
по которым мы можем сравнивать пользователей 🙂
Вы можете добавить функцию-член FindUser как виртуальную к абстрактному классу User и сделать так, чтобы она возвращала значение true, если искомый пользователь является текущим пользователем (Personal или Group).
В GroupUser вы можете переопределить FindUser и делегировать любой вызов всем содержащимся в нем пользователям, если искомый пользователь не является текущим GroupUser.
Как сказал 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;
}
}
Вы можете использовать, например, dynamic_cast<>()
проверить, если User*
действительно GroupUser
или нет, вот так:
GroupUser* groupUser = dynamic_cast<GroupUser*>(userPointer);
Если он возвращает нулевой указатель, то userPointer
это не GroupUser
,