假设我有一个简单的复合模式结构:
抽象类User
leaf class PersonalUser
复合类GroupUser
,其中std::vector<User*> users
容器作为其成员变量
以及方法bool GroupUser::findUser(User* u)
,如果在true
容器中找到用户u
,则该方法users
会返回PersonalUser
,该容器自然由其他GroupUser
或{{ 1}}对象)
现在,我想以递归方式定义该函数,因此我需要遍历User
向量中的每个users
,并与u
进行比较,但我赢了“知道User
是PersonalUser
还是GroupUser
,所以我的问题是:
我是否必须定义一个虚拟函数char User::returnType()
,它会告诉我它是User
的哪种类型,或者是否有更好/更智能的方法来查找树并寻找User
?
P.S。当然有一种类似bool areEqual(User*, User*)
的方法可以用来比较用户:)
答案 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
。