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
传递到