2011-02-12 65 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(); 
相關問題