私が理解した解決策がすべての場合にうまく機能するかどうか疑問に思っていました。
私は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
これを行う正しい/より良い方法はありますか?