我有两个班级,TProvider
和TEncrypt
。调用应用程序将与TProvider
类通信。调用应用程序将首先调用Initialise
以获取句柄mhProvider
。我稍后在尝试执行加密时需要访问此句柄,因为TEncrypt
类donot可以访问此句柄mhProvider
。我怎样才能访问这个句柄?
class TProvider
{
public:
int Initialise();
int Encrypt();
private:
HCRYPTPROV mhProvider;
TEncrypt* mpEncrypt;
};
//------------------------------------
class TEncrypt
{
public:
int Encryption();
private:
int GenerateEncryptionKey();
HCRYPTKEY mhKey;
};
//------------------------------------
int TEncrypt::Encryption()
{
vStatus = GenerateEncryptionKey();
// will go on to perform encryption after obtaining the key
return(vStatus);
}
//------------------------------------
int TEncrypt::GenerateEncryptionKey()
{
BOOL bRet = CryptGenKey(mhProvider,
CALG_AES_256,
CRYPT_EXPORTABLE,
&mhKey);
}
答案 0 :(得分:2)
您可以通过(构造函数/方法)参数将句柄传递给TEncrypt,也可以通过全局变量使其可用。我更喜欢前者,因为全局变量使得代码更难理解,维护和测试。
可用性也可以是间接的,例如你将一个对象传递给TEncrypt::Encryption()
,它通过一种公共方法提供对句柄的访问。
(当然你也可以把它传递给一个文件,DB,......但是让我们把重点放在程序中。)
class TEncrypt
{
public:
int Encrypt(HCRYPTPROV& mhProvider);
private:
int GenerateEncryptionKey(HCRYPTPROV& mhProvider);
HCRYPTKEY mhKey;
};
//------------------------------------
int TEncrypt::Encrypt(HCRYPTPROV& mhProvider)
{
vStatus = GenerateEncryptionKey(mhProvider);
// will go on to perform encryption after obtaining the key
return(vStatus);
}
//------------------------------------
int TEncrypt::GenerateEncryptionKey(HCRYPTPROV& mhProvider)
{
BOOL bRet = CryptGenKey(mhProvider,
CALG_AES_256,
CRYPT_EXPORTABLE,
&mhKey);
}
注意:我重命名为TEncrypt::Encrypt
,因为最好使用动词作为方法名而不是名词。
答案 1 :(得分:1)
在TProvider
类中使用getter而不是Initialise
来处理类之间的对话:
HCRYPTPROV TProvider::get_hProvider() const
{
return mhProvider;
}
您也可以查看Mediator Pattern。
答案 2 :(得分:1)
如果mhProvider
需要TEncrypt
,那为什么它会在课程TProvider
中?不知何故,你的课程看起来设计得不合适。
答案 3 :(得分:0)
为什么不将它传递给TEncrypt
的构造函数或Encryption
成员函数?