C++ 具有仅由唯一类型的类可用的方法

C++ 具有仅由唯一类型的类可用的方法,c++,encapsulation,C++,Encapsulation,我目前正在寻找一种适当的方法,通过特定类型的类来限制方法的使用。更清楚地说,情况如下: 我有一个专门用于服务器联网的类(我们称之为ClientSession)。客户端连接到服务器后,有30秒的时间进行身份验证,否则服务器将关闭连接 身份验证由服务器上的另一个类处理(我们称之为Authenticator),该类将“警告”ClientSession,客户端身份验证成功,30秒计时器可以取消 问题是,这需要验证器调用ClientSession的公共方法。但我不希望任何人都能调用该方法 总之,我希望Au

我目前正在寻找一种适当的方法,通过特定类型的类来限制方法的使用。更清楚地说,情况如下:

我有一个专门用于服务器联网的类(我们称之为
ClientSession
)。客户端连接到服务器后,有30秒的时间进行身份验证,否则服务器将关闭连接

身份验证由服务器上的另一个类处理(我们称之为
Authenticator
),该类将“警告”
ClientSession
,客户端身份验证成功,30秒计时器可以取消

问题是,这需要
验证器
调用
ClientSession
的公共方法。但我不希望任何人都能调用该方法

总之,我希望
Authenticator
是唯一能够调用
ClientSession::clientAuthSuccessful()方法的类

我调查了两件事:

  • Friend方法,但我不希望
    Authenticator
    能够通过Friend方法访问所有私有方法和属性或
    ClientSession
  • Visitor设计模式,但它似乎并不完全符合我的要求(除非我误解了它的用法)

有没有其他办法来限制这些具体的限制?或者一个干净的替代方法?

没有干净的方法可以做到这一点,不。您可以使用朋友类,也可以使用公共方法

没有干净的方法并不意味着不可能。我永远不会编写这样的代码,您也不应该,但以下内容确实符合要求:

class Lock
{
    friend class B;
private:
    Lock() {};
};


class A
{
public:
    A() {}
    void foo(Lock x){}
};

class B
{
    void foo()
    {
        Lock l;
        A a;
        a.foo(l);
    }
};
由于
class B
是唯一可以创建
Lock
实例的类,并且
A::foo
需要一个
Lock
实例作为参数,因此它只能由
B
调用


但不要这样做。我建议在标题中添加注释和文档。

没有干净的方法可以做到这一点,不。您可以使用好友类或公共方法

没有干净的方法并不意味着不可能。我永远不会编写这样的代码,您也不应该,但以下内容确实符合要求:

class Lock
{
    friend class B;
private:
    Lock() {};
};


class A
{
public:
    A() {}
    void foo(Lock x){}
};

class B
{
    void foo()
    {
        Lock l;
        A a;
        a.foo(l);
    }
};
由于
class B
是唯一可以创建
Lock
实例的类,并且
A::foo
需要一个
Lock
实例作为参数,因此它只能由
B
调用


但不要这样做。我建议在标题中添加注释和文档。

您可以创建一个代理类,用于
ClientSession
好友和好友
身份验证者
当遇到问题时,您可以创建一个代理类,用于
ClientSession
好友和好友
身份验证者,人们通常会想到如何解决这个问题,并将精力花在如何实施这个解决方案上。有时,最好重新审视问题并考虑其他解决方案

例如,与其让
Authenticator
尝试通知传递给它的
ClientSession
(或者更好,通过调用传递给它的某种回调),不如让
ClientSession
(或者其他一些对象/线程)调用类似
Authenticator::waitForAuthentication]的方法(整数超时)


编辑:我想我应该详细说明回调的概念。重点是,
Authenticator
不需要了解
ClientSession
类来完成它的工作;它只需要知道调用一些函数或其他可调用的函数

因此,您编写
验证器
以获得一个方法,该方法接受正确签名的某个
std::function
对象,并具有
ClientSession
(或其他内容)创建一个合适的对象来传递。它可以是一个类似于Luchian Grigore建议的专用函数对象。可能是一个更通用的对象,也可能是一个通过引用
ClientSession
对象的私有部分初始化的对象。或者是一个lambda,如果可以使用C++11的话


也就是说,我怀疑有一个
waitForAuthentication
方法(或者完全其他的方法)很可能是您的应用程序真正想要的。

当遇到问题时,人们通常会想到如何解决它,并将我们的精力花在如何实现该解决方案上。有时,最好重新审视问题并考虑其他解决方案

例如,与其让
Authenticator
尝试通知传递给它的
ClientSession
(或者更好,通过调用传递给它的某种回调),不如让
ClientSession
(或者其他一些对象/线程)调用类似
Authenticator::waitForAuthentication]的方法(整数超时)


编辑:我想我应该详细说明回调的概念。重点是,
Authenticator
不需要了解
ClientSession
类来完成它的工作;它只需要知道调用一些函数或其他可调用的函数

因此,您编写
验证器
以获得一个方法,该方法接受正确签名的某个
std::function
对象,并具有
ClientSession
(或其他内容)创建一个合适的对象来传递。它可以是一个类似于Luchian Grigore建议的专用函数对象。可能是一个更通用的对象,也可能是一个通过引用
ClientSession
对象的私有部分初始化的对象。或者是一个lambda,如果可以使用C++11的话


也就是说,我怀疑对于您的应用程序来说,使用
waitForAuthentication
方法(或者完全使用其他方法)很可能是您真正想要的。

有一种更简单的方法。只需将一些特殊用途的代码从
ClientSession
传递到