Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 基于用户输入从模板创建对象_C++_Oop_Templates_Pointers_Cryptography - Fatal编程技术网

C++ 基于用户输入从模板创建对象

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_

我正在使用crypto++库编写一个应用程序。对于不熟悉它的人,ECB_模式模板类继承自CipherModeBase。程序编译并运行,但我得到的输出不正确。当我从cipher_对象调用加密方法时,它的工作方式与直接使用ECB_模式对象的工作方式不同。我已经验证了选项对象实例变量的分配是否正确。我想在if\u-then\u-else结构或switch\u案例中创建实例,这样我就可以保持代码整洁。我做错了什么

以下是我正在尝试但不起作用的内容:

    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) );