#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[]) { }
解决方法
如果你定义一个没有任何构造函数的类,那么编译器会为你编译一个构造函数(这将是默认的构造函数,也就是说,不需要任何参数).然而,如果你定义一个构造函数(即使它有一个或多个参数),那么编译器也不会为你构建一个构造函数 – 在这一点上,你负责构造该类的对象,所以编译器“退后退”,可以这么说,把这个工作留给你.
你有两个选择.您需要提供默认构造函数,或者在定义对象时需要提供正确的参数.例如,您可以将构造函数更改为:
Blowfish(BlowfishAlgorithm algorithm = CBC);
…所以可以调用ctor(没有(明确))指定一个算法(在这种情况下它将使用CBC作为算法).
另一种方法是在定义Blowfish对象时明确指定算法:
class GameCryptography { Blowfish blowfish_; public: GameCryptography() : blowfish_(ECB) {} // ... };
最后,我想值得一提的是,ECB,CFB等都是运营模式,而不是真正的加密算法本身.调用它们的算法不会打扰编译器,但是不合理地可能会为其他人读取代码造成问题.