0

私が理解した解決策がすべての場合にうまく機能するかどうか疑問に思っていました。

私はServerクラスを持っており、Pageクラスとして保存されているページ間のユーザーアクセスを処理し、単一の属性がページの相対URLです。また、ページからページへのリクエストも保存します。これもRequestクラスとして保存され、リファラーとターゲットページの両方への参照が含まれます。

問題は、PageオブジェクトがRequestオブジェクトへの2セットのポインターを格納することです。1つはターゲット(送信要求)用で、もう1つはリファラー(受信要求)用です。このセットでの検索は、2つのページに関連付けられたリクエストを取得するために、指定されたURLを使用して実行する必要があります。

呼び出しは次のようになります。Request * referrer = page.Referrer("/page2.html");

今私の現在のコードのために:

// page.h

#include <set> 
#include <string> 
#include "request.h"

class Page
{
    struct compReferrers
    {
        bool operator()(Request * const &, Request * const &) const;
    }; // struct compReferrers

    struct compTargets
    {
        bool operator()(Request * const &, Request * const &) const;
    }; // struct compReferrers

    std::string url_;
    std::set<Request *, compReferrers> referrers_;
    std::set<Request *, compTargets> targets_;

    public:
        Page(const std::string & url): url_(url) {}

        // Problematic methods
        Request * Referrer(const std::string & url) const;
        Request * Target(const std::string & url) const;

        // Getter
        inline std::string Url() const { return url_; }
}; // class Page

// page.cpp

#include "page.h"

Request * Page::Referrer(const std::string & url) const
{
    Page referrer(url), target("dummy");
    Request req(referrer, target);
    std::set<Request *, compRefferers>::const_iterator it;
    it = referrers_.find(&req);
    if (it != referrers_.end())
    {
        return *it;
    }
    else
    {
        return 0;
    }
}

bool Page::compReferrers::operator()(Request * const & left,
        Request * const & right) const
{
    if (left == 0) return true;
    else if (right == 0) return false;
    else return left->Referrer().Url() < right->Referrer().Url();
}

bool Page::compTargets::operator()(Request * const & left, 
        Request * const & right) const
{
    if (left == 0) return true;
    else if (right == 0) return false;
    else return left->Target().Url() < right->Target().Url();
}

// request.h

class Page;

class Request
{
    public:
        Request(Page & referrer, Page & target):
            referrer_(referrer), target_(target), visits_(0) {}

        // Useful code
        inline void Visit() { ++visits_; }
        inline Page & Referrer() const { return referrer_; }
        inline Page & Target() const { return target_; }

    private:
        Page & referrer_;
        Page & target_;
        std::size_t visits_;
}; // class Request

これを行う正しい/より良い方法はありますか?

4

0 に答える 0