1

単純な複合パターン構造があるとします。

  • 抽象クラスUser

  • リーフクラスPersonalUser

  • コンテナーをメンバー変数としてGroupUser持つ複合クラスstd::vector<User*> users

そして、ユーザーがコンテナ(他のオブジェクトまたはオブジェクトで自然に構成されている)で見つかった場合bool GroupUser::findUser(User* u)に返されるメソッドtrueuusersPersonalUserGroupUser

さて、もちろんその関数を再帰的に定義したいので、それぞれUserをベクトルで調べてusersと比較する必要がありますが、がaか、かわからないので、私の質問は次のとおりです。uUserPersonalUserGroupUser

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

たとえば、次のように、aが本当にaであるかdynamic_cast<>()どうかを確認するために使用できます。User*GroupUser

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

nullポインタを返す場合、はでuserPointerはありませんGroupUser

于 2012-09-07T13:22:54.293 に答える