我只是想知道我刚刚想出的解决方案是否在所有情况下都能正常工作。
我有一个 Server 类,处理页面之间的用户访问,这些页面存储为 Page 类,其中一个属性是页面的相对 URL。我还存储从 Page 到 Page 的请求,也存储为 Request 类,具有对引用者和目标页面的引用。
困难在于 Page 对象存储了两组指向 Request 对象的指针:一组指向目标(传出请求),一组指向引用者(传入请求);应该使用给定的 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
有没有正确/更好的方法来做到这一点?