C++ 基于用户输入从模板创建对象
我正在使用crypto++库编写一个应用程序。对于不熟悉它的人,ECB_模式模板类继承自CipherModeBase。程序编译并运行,但我得到的输出不正确。当我从cipher_对象调用加密方法时,它的工作方式与直接使用ECB_模式对象的工作方式不同。我已经验证了选项对象实例变量的分配是否正确。我想在if\u-then\u-else结构或switch\u案例中创建实例,这样我就可以保持代码整洁。我做错了什么 以下是我正在尝试但不起作用的内容:C++ 基于用户输入从模板创建对象,c++,oop,templates,pointers,cryptography,C++,Oop,Templates,Pointers,Cryptography,我正在使用crypto++库编写一个应用程序。对于不熟悉它的人,ECB_模式模板类继承自CipherModeBase。程序编译并运行,但我得到的输出不正确。当我从cipher_对象调用加密方法时,它的工作方式与直接使用ECB_模式对象的工作方式不同。我已经验证了选项对象实例变量的分配是否正确。我想在if\u-then\u-else结构或switch\u案例中创建实例,这样我就可以保持代码整洁。我做错了什么 以下是我正在尝试但不起作用的内容: CipherModeBase *cipher_
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);
CipherModeBase*cipher\u对象;
密码_对象==NULL;
如果(选项->密码==BS_AES)
{
ECB_模式::加密ECbenchOption(选项->密钥,选项->密钥);
密码\u对象=&ecbenchyption;
}
else if(选项->密码==BS_TWOFISH)
{
ECB_模式::加密ECbenchOption(选项->密钥,选项->密钥);
密码\u对象=&ecbenchyption;
}
密码\u对象->处理数据(args);
以下是工作原理:
ECB_Mode<AES >::Encryption ecbEncryption(options->key, options->keylen);
ecbEncryption.processData(args);
ECB_模式::加密ecbenchyption(选项->密钥,选项->密钥);
ecbEncryption.processData(args);
另外,我知道不要使用ECB模式。我只是不想搞乱静脉注射,直到我能让一切正常。我对C++还比较缺乏经验。 < P>这里:
cipher_object == NULL;
if(options->cipher == BS_AES)
{
// v
ECB_Mode<AES >::Encryption ecbEncryption(options->key, options->keylen);
cipher_object = &ecbEncryption;
}
您应该对另一个if语句执行相同的操作
还请注意:
cipher_object == NULL;
应改为:
cipher_object = NULL;
但是,应该使用上面的代码来解决这个问题。您的ecbEncryption对象在if和else范围内的堆栈上声明。(范围是用花括号括起来的东西) 当对象在退出中声明的作用域时,该对象将被销毁。因此,调用processData的对象在调用该方法之前已被删除。显然,这行不通 一个选项是可以在堆上而不是堆栈上声明对象。这样的话,你的一生就可以按照你想要的方式工作 尝试对cipher_对象使用std::unique_ptr,而不是原始指针。然后,在if和else条款中,指定如下内容:
cipher_object.reset( new ECB_Mode<AES>::Encryption(options->key, options->keylen) );
cipher_object.reset(新ECB_模式::加密(选项->密钥,选项->密钥));
然后该对象将保留在堆上,直到cipher_对象的作用域结束,此时unique_ptr将为您删除它。而且,cipher_对象的作用域将持续到您对其调用任何方法之后。谢谢!成功了。很好地理解了比较运算符,也许是时候休息一下了……您还需要记住在使用完cipher_对象后“删除cipher_对象”。
cipher_object.reset( new ECB_Mode<AES>::Encryption(options->key, options->keylen) );