2011-02-12 27 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[]) 
{ 
} 

Error: IntelliSense: no existe un constructor predeterminado para la clase "Blowfish" ???!no existe un constructor predeterminado para la clase

+0

No elimine toda su pregunta. Déjalo en su lugar. – greyfade

+1

No tener un constructor predeterminado no es problema, siempre y cuando no use uno. Siempre es correcto especificar un argumento en la construcción, cuando no hay un argumento predeterminado obvio. –

Respuesta

31

Si se define una clase sin ningún constructor, el compilador sintetizará un constructor para usted (y que habrá un constructor por defecto - es decir, uno que no requiere ningún argumento). Sin embargo, si define define un constructor, (incluso si toma uno o más argumentos) el compilador no no sintetizará un constructor para usted - en ese punto, usted se ha responsabilizado de la construcción de objetos de ese clase, por lo que el compilador "retrocede", por así decirlo, y te deja ese trabajo.

Tiene dos opciones. Debe proporcionar un constructor predeterminado o debe proporcionar el parámetro correcto cuando defina un objeto. Por ejemplo, usted podría cambiar su constructor para ser algo como:

Blowfish(BlowfishAlgorithm algorithm = CBC); 

... por lo que el ctor podría ser invocada sin (explícitamente) que especifica un algoritmo (en cuyo caso se utilizaría CBC como el algoritmo).

La otra alternativa sería especificar explícitamente el algoritmo cuando se define un objeto de Blowfish:

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

Como nota final, creo que vale la pena mencionar que ECB, CBC, CFB, etc., son modos de operación, no son algoritmos de cifrado en sí mismos. Llamarlos algoritmos no molestará al compilador, pero es irrazonablemente probable que cause un problema para otros que leen el código.

+0

¿Qué sucede si estoy tratando de inicializar una matriz de objetos Blowfish? es decir: Blowfish blowfish_ [] ... ¿cómo uso ctor para eso? – neid

+1

@nagheid: los objetos en dicha matriz siempre se construyen con constructores predeterminados. Por mucho, la solución más fácil es 'std :: vector', aunque puede hacerlo usted mismo con' std :: aligned_storage' y placement new –

4

Un constructor predeterminado es un constructor que no tiene parámetros, o si tiene parámetros, todos los parámetros tienen valores predeterminados.

5

Se ha declarado en el pez globo constructor como esto:

Blowfish(BlowfishAlgorithm algorithm); 

Así que esta línea no puede existir (sin más tarde inicialización):

Blowfish _blowfish; 

ya que se pasa ningún parámetro. No entiende cómo manejar una declaración sin parámetros del objeto "BlowFish" - necesita crear otro constructor para eso.

7

Debido a que tiene esto:

Blowfish(BlowfishAlgorithm algorithm); 

No es un constructor dedefecto. El constructor predeterminado es uno que no toma parámetros. es decir,

Blowfish(); 
Cuestiones relacionadas