2011-02-12 66 views
13
#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”???!没有默认构造函数存在类

+0

请不要删除您的整个问题。留在原地。 – greyfade 2011-02-12 23:23:08

+1

只要你不使用默认构造函数就没有问题。当没有明显的默认参数时,始终在构造中指定参数是可以的。 – 2011-02-13 14:52:37

回答

31

如果你定义一个类没有任何构造函数,编译器会合成一个构造你(这将是一个默认的构造 - 即,一个不需要任何参数)。但是,如果你做定义构造,(即使它确实需要一个或多个参数),编译器将合成一个构造你 - 在这一点上,你已经采取了责任建设的的对象类,所以编译器“退后一步”,可以这么说,并把这个工作留给你。

你有两种选择。您需要提供默认构造函数,或者在定义对象时需要提供正确的参数。例如,你可以改变你的构造函数看起来是这样的:

Blowfish(BlowfishAlgorithm algorithm = CBC); 

...这样的构造函数可以没有(明确)指定的算法(在这种情况下,它会使用CBC的算法)来调用。

另一种方法是,当你定义一个河豚对象明确指定算法:

class GameCryptography { 
    Blowfish blowfish_; 
public: 
    GameCryptography() : blowfish_(ECB) {} 
    // ... 
}; 

最后一点,我认为这是值得一提的是,ECB,CBC,CFB等,都是模式的操作,而不是真正的加密算法本身。调用它们的算法不会打扰编译器,但不合理的可能会导致其他人阅读代码的问题。

4

一个默认构造函数是一个构造函数,要么没有参数,或者如果它有参数,所有的参数都有默认值。 (后来没有进一步的初始化)

Blowfish(BlowfishAlgorithm algorithm); 

所以这行就不能存在:

5

你声明的构造河豚,因为这

Blowfish _blowfish; 

,因为你没有通过参数。它不知道如何处理对象“BlowFish”的无参数声明 - 您需要为此创建另一个构造函数。

7

因为你有这样的:

Blowfish(BlowfishAlgorithm algorithm); 

这不是一个默认构造。默认的构造函数是不带参数的构造函数。即

Blowfish(); 
相关问题