1

假设我有一个简单的复合模式结构:

  • 抽象类User

  • 叶类PersonalUser

  • GroupUserstd::vector<User*> users容器为成员变量的复合类

以及如果在容器中找到用户(自然由其他或对象组成)则bool GroupUser::findUser(User* u)返回的方法trueuusersPersonalUserGroupUser

现在,我当然想递归地定义该函数,所以我需要遍历向量中的每个Userusers并与 进行比较u,但我不知道是否User是 aPersonalUserGroupUser,所以我的问题是:

我是否必须定义一个虚拟函数char User::returnType()来告诉我User它是哪种类型,或者是否有更好/更智能的方法可以沿着树向下寻找User

ps 当然有一种方法bool areEqual(User*, User*),我们可以通过它来比较用户:)

4

3 回答 3

4

您可以将 FindUser 成员函数作为虚拟添加到抽象类 User 中,如果正在搜索的用户是当前用户(个人或组),则使其返回 true。

在 GroupUser 中,如果要搜索的用户不是当前的 GroupUser,您可以覆盖 FindUser 并将任何调用委托给所有包含的用户。

于 2012-09-07T13:27:26.193 回答
3

正如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;
    }
}
于 2012-09-07T13:55:41.537 回答
1

您可以使用 egdynamic_cast<>()来检查 aUser*是否真的是 a GroupUser,如下所示:

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

如果它返回一个空指针,则userPointer不是GroupUser.

于 2012-09-07T13:22:54.293 回答