两个类 - 如何从另一个类访问一个类的对象?

时间:2010-09-22 12:17:13

标签: c++ visual-c++ class

我有两个班级,TProviderTEncrypt。调用应用程序将与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);
}

4 个答案:

答案 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成员函数?