gpt4 book ai didi

c++ - 根据用户输入从模板创建对象

转载 作者:行者123 更新时间:2023-11-30 03:01:24 25 4
gpt4 key购买 nike

我正在使用 crypto++ 库编写应用程序。对于那些不熟悉它的人,ECB_Mode 模板类继承自 CipherModeBase。程序编译并运行,但我得到的输出不正确。当我从 cipher_object 调用加密方法时,它的工作方式与直接使用 ECB_Mode 对象不同。我已验证选项对象实例变量已正确分配。我想在 if_then_else 结构或 switch_case 中创建实例,这样我就可以保持代码美观和干燥。我做错了什么?

这是我正在尝试但不起作用的方法:

    CipherModeBase *cipher_object;
cipher_object == NULL;

if(options->cipher == BS_AES)
{
ECB_Mode<AES >::Encryption ecbEncryption(options->key, options->keylen);
cipher_object = &ecbEncryption;
}
else if(options->cipher == BS_TWOFISH)
{
ECB_Mode<Twofish >::Encryption ecbEncryption(options->key, options->keylen);
cipher_object = &ecbEncryption;
}
cipher_object->processData(args);

这是有效的:

ECB_Mode<AES >::Encryption ecbEncryption(options->key, options->keylen);
ecbEncryption.processData(args);

附言。我知道不要使用 ECB 模式。在一切正常之前,我只是不想弄乱 IV。我对 C++ 也相对缺乏经验。

最佳答案

您的 ecbEncryption 对象在 if 和 else 范围内的堆栈上声明。 (范围是用大括号括起来的东西)。

当对象声明的作用域退出时,对象将被销毁。因此,在您调用该方法之前,您调用 processData 的对象已被删除。显然那是行不通的。

一种选择是您可以在堆上而不是堆栈上声明对象。这样可以控制生命周期以您想要的方式工作。

尝试为 cipher_object 使用 std::unique_ptr 而不是原始指针。然后,在 if 和 else 子句中分配给它:

cipher_object.reset( new ECB_Mode<AES>::Encryption(options->key, options->keylen) );

然后该对象将保留在堆上,直到 cipher_object 范围结束,此时 unique_ptr 将为您删除它。而且,cipher_object 的作用域将持续到您对其调用任何方法之后。

关于c++ - 根据用户输入从模板创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11085305/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com