#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[])
{
}
Run Code Online (Sandbox Code Playgroud)
错误:IntelliSense:类"Blowfish"没有默认构造函数???!
Jer*_*fin 41
如果您定义一个没有任何构造函数的类,编译器将为您合成一个构造函数(这将是一个默认构造函数 - 即,不需要任何参数的构造函数).但是,如果你确实定义了一个构造函数(即使它确实需要一个或多个参数),编译器也不会为你合成一个构造函数 - 此时,你已经负责构造该类的对象,所以编译器"退后一步",可以这么说,并把这份工作留给你.
你有两个选择.您需要提供默认构造函数,或者在定义对象时需要提供正确的参数.例如,您可以将构造函数更改为:
Blowfish(BlowfishAlgorithm algorithm = CBC);
Run Code Online (Sandbox Code Playgroud)
...因此可以在没有(明确地)指定算法的情况下调用ctor(在这种情况下,它将使用CBC作为算法).
另一种方法是在定义Blowfish对象时明确指定算法:
class GameCryptography {
Blowfish blowfish_;
public:
GameCryptography() : blowfish_(ECB) {}
// ...
};
Run Code Online (Sandbox Code Playgroud)
作为最后一点,我认为值得一提的是ECB,CBC,CFB等都是操作模式,而不是真正的加密算法本身.称他们的算法不会打扰编译器,但是是不合理可能导致问题为他人阅读的代码.
因为你有这个:
Blowfish(BlowfishAlgorithm algorithm);
Run Code Online (Sandbox Code Playgroud)
它不是默认构造函数.默认构造函数是不带参数的构造函数.即
Blowfish();
Run Code Online (Sandbox Code Playgroud)
你将构造函数blowfish声明为:
Blowfish(BlowfishAlgorithm algorithm);
Run Code Online (Sandbox Code Playgroud)
所以这行不能存在(以后不再进一步初始化):
Blowfish _blowfish;
Run Code Online (Sandbox Code Playgroud)
因为你没有传递任何参数.它不理解如何处理对象"BlowFish"的无参数声明 - 你需要为它创建另一个构造函数.