#include "Includes.h"
enum BlowfishAlgorithm
{
ECB,
CBC,
CFB64,
OFB64,
};
class Blowfish
{
public:
struct bf_key_st
{
unsigned long P[18];
unsigned long S[1024];
};
Blowfish(BlowfishAlgorithm algorithm);
void Dispose();
void SetKey(unsigned char data[]);
unsigned char Encrypt(unsigned char buffer[]);
unsigned char Decrypt(unsigned char buffer[]);
char EncryptIV();
char DecryptIV();
private:
BlowfishAlgorithm _algorithm;
unsigned char _encryptIv[200];
unsigned char _decryptIv[200];
int _encryptNum;
int _decryptNum;
};
class GameCryptography
{
public:
Blowfish _blowfish;
GameCryptography(unsigned char key[]);
void Decrypt(unsigned char packet[]);
void Encrypt(unsigned char packet[]);
Blowfish Blowfish;
void SetKey(unsigned char k[]);
void SetIvs(unsigned char i1[],unsigned char i2[]);
};
GameCryptography::GameCryptography(unsigned char key[])
{
}
错误:IntelliSense:类“Blowfish”不存在默认构造函数???!
如果您定义一个没有任何构造函数的类,编译器将为您合成一个构造函数(这将是一个默认构造函数——即不需要任何参数的构造函数)。但是,如果您 do 定义一个构造函数,(即使它确实需要一个或多个参数)编译器将 not 为您合成一个构造函数——在这一点上,您已经负责构造该构造函数的对象类,所以编译器“退后一步”,可以这么说,把这项工作留给你。
你有两个选择。您需要提供默认构造函数,或者在定义对象时需要提供正确的参数。例如,您可以将构造函数更改为如下所示:
Blowfish(BlowfishAlgorithm algorithm = CBC);
...因此可以在不(显式)指定算法的情况下调用 ctor(在这种情况下它将使用 CBC 作为算法)。
另一种选择是在定义 Blowfish 对象时显式指定算法:
class GameCryptography {
Blowfish blowfish_;
public:
GameCryptography() : blowfish_(ECB) {}
// ...
};
在 C++ 11(或更高版本)中,您还有一个可用的选项。您可以定义带有参数的构造函数,然后告诉编译器生成如果您没有定义参数它将具有的构造函数:
class GameCryptography {
public:
// define our ctor that takes an argument
GameCryptography(BlofishAlgorithm);
// Tell the compiler to do what it would have if we didn't define a ctor:
GameCryptography() = default;
};
最后一点,我认为值得一提的是,ECB、CBC、CFB 等是操作模式,并不是真正的加密算法本身。调用它们算法不会打扰编译器,但不合理地可能会给其他人阅读代码带来问题。
因为你有这个:
Blowfish(BlowfishAlgorithm algorithm);
它不是 default 构造函数。默认构造函数是一个不带参数的构造函数。即
Blowfish();
默认构造函数是一个没有参数的构造函数,或者如果它有参数,所有参数都有默认值。
您将构造函数
Blowfish
声明为:
Blowfish(BlowfishAlgorithm algorithm);
所以这条线不存在(后面没有进一步初始化):
Blowfish _blowfish;
因为你没有传递任何参数。它不理解如何处理对象的无参数声明
Blowfish
- 你需要为此创建另一个构造函数。
注意: 如果您定义用户提供的构造函数,默认构造函数将消失。
这是典型的人为错误。 Intelisense 出于一个原因要求这样做,您正在创建一个没有堆栈参数的对象:
public:
Blowfish _blowfish;
该声明需要默认构造函数。纠正此问题的一种选择是使用 new 创建对象。
Blowfish myBlowfish = new Blowfish(algorithm);
第二个选项是根据要求创建默认构造函数。