Два класса -Как получить доступ к объекту одного класса из другого? - PullRequest
0 голосов
/ 22 сентября 2010

У меня есть два класса, TProvider и TEncrypt. Вызывающее приложение будет общаться с классом TProvider. Вызывающее приложение сначала вызовет Initialise, чтобы получить дескриптор mhProvider. Мне потребуется доступ к этому дескриптору позже, когда я попытаюсь выполнить шифрование, поскольку у класса TEncrypt нет доступа к этому дескриптору 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 ]

2 голосов
/ 22 сентября 2010

Либо вы передаете дескриптор TEncrypt с помощью параметра (конструктор / метод) , либо вы делаете его доступным с помощью глобальной переменной . Я бы предпочел первое, поскольку глобальные переменные затрудняют понимание, сопровождение и тестирование кода.

Доступность также может быть косвенной, например, Вы передаете объект в TEncrypt::Encryption(), который обеспечивает доступ к дескриптору одним из его открытых методов.

(конечно, вы также можете передать его через файл, БД, ... но давайте сосредоточимся на программе.)

Обновление: пример

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 голос
/ 22 сентября 2010

Если TEncrypt нужен mhProvider, то почему он в классе TProvider? Каким-то образом ваши классы не выглядят должным образом.

1 голос
/ 22 сентября 2010

Используйте метод получения в классе TProvider вместо Initialise для обработки разговоров между классами:

HCRYPTPROV TProvider::get_hProvider() const
{
    return mhProvider;
}

Вы также можете взглянуть на образец посредника .

0 голосов
/ 22 сентября 2010

Почему бы просто не передать его конструктору TEncrypt или функции-члену Encryption?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...