no existe un constructor predeterminado para la clase

#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” ???

Si defines una clase sin ningún constructor, el comstackdor sintetizará un constructor para ti (y ese será un constructor predeterminado, es decir, uno que no requiera ningún argumento). Sin embargo, si define un constructor (incluso si toma uno o más argumentos), el comstackdor no sintetizará un constructor para usted; en ese punto, se habrá hecho responsable de construir objetos de esa clase, por lo que el comstackdor “retrocede”, por así decirlo, y te deja ese trabajo.

Tienes dos opciones. Debe proporcionar un constructor predeterminado o debe proporcionar el parámetro correcto cuando defina un objeto. Por ejemplo, puede cambiar su constructor para que se vea algo así como:

 Blowfish(BlowfishAlgorithm algorithm = CBC); 

… para que el ctor pueda ser invocado sin (explícitamente) especificar un algoritmo (en cuyo caso usaría CBC como el algoritmo).

La otra alternativa sería especificar explícitamente el algoritmo cuando defina un objeto 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, en realidad no son algoritmos de encriptación. Llamarlos algoritmos no molestará al comstackdor, pero es irrazonablemente probable que cause un problema para otros que leen el código.

Porque tienes esto:

 Blowfish(BlowfishAlgorithm algorithm); 

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

 Blowfish(); 

Usted declaró el constructor blowfish así:

 Blowfish(BlowfishAlgorithm algorithm); 

Entonces esta línea no puede existir (sin una posterior inicialización):

 Blowfish _blowfish; 

ya que no pasó ningún parámetro. No entiende cómo manejar una statement sin parámetros del objeto “BlowFish” – necesita crear otro constructor para eso.

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