在Composite模式中搜索特定元素

时间:2012-09-07 13:13:48

标签: c++ oop design-patterns iterator composite

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

  • 抽象类User

  • leaf class PersonalUser

  • 复合类GroupUser,其中std::vector<User*> users容器作为其成员变量

以及方法bool GroupUser::findUser(User* u),如果在true容器中找到用户u,则该方法users会返回PersonalUser,该容器自然由其他GroupUser或{{ 1}}对象)

现在,我想以递归方式定义该函数,因此我需要遍历User向量中的每个users,并与u进行比较,但我赢了“知道UserPersonalUser还是GroupUser,所以我的问题是:

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

P.S。当然有一种类似bool areEqual(User*, User*)的方法可以用来比较用户:)

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分: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;
    }
}

答案 2 :(得分:1)

您可以使用例如dynamic_cast<>()检查User*是否真的是GroupUser,如下所示:

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

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