Для класса нет конструктора по умолчанию
#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[])
{
}
Ошибка: IntelliSense: для класса "Blowfish" не существует конструктор по умолчанию???!
Ответы
Ответ 1
Если вы определяете класс без какого-либо конструктора, компилятор будет синтезировать для вас конструктор (и это будет конструктор по умолчанию, т.е. тот, который не требует каких-либо аргументов). Если, однако, вы определяете конструктор (даже если он принимает один или несколько аргументов), то компилятор не будет синтезировать для вас конструктор. В этот момент вы взяли на себя ответственность за построение объектов этого класса, поэтому компилятор "отступает", так сказать, и оставляет эту работу вам.
У вас есть два варианта. Вам нужно либо предоставить конструктор по умолчанию, либо вам нужно указать правильный параметр при определении объекта. Например, вы можете изменить свой конструктор, чтобы выглядеть примерно так:
Blowfish(BlowfishAlgorithm algorithm = CBC);
... поэтому ctor может быть вызван без (явно) задания алгоритма (в этом случае он будет использовать CBC в качестве алгоритма).
Другой альтернативой было бы явно указать алгоритм, когда вы определяете объект Blowfish:
class GameCryptography {
Blowfish blowfish_;
public:
GameCryptography() : blowfish_(ECB) {}
// ...
};
Как последнее замечание, я думаю, стоит упомянуть, что ECB, CBC, CFB и т.д. - это режимы работы, а не сами алгоритмы шифрования. Вызов их алгоритмов не будет беспокоить компилятор, но необоснованно может вызвать проблемы для других, читающих код.
Ответ 2
Потому что у вас есть это:
Blowfish(BlowfishAlgorithm algorithm);
Это не стандартный конструктор. Конструктор по умолчанию - это тот, который не принимает никаких параметров. то есть.
Blowfish();
Ответ 3
Вы объявили конструктор blowfish как это:
Blowfish(BlowfishAlgorithm algorithm);
Таким образом, эта строка не может существовать (без дальнейшей инициализации позже):
Blowfish _blowfish;
так как вы не передали параметр. Он не понимает, как обрабатывать декларацию объекта без параметров "BlowFish" - вам нужно создать для него другой конструктор.
Ответ 4
Конструктор по умолчанию - это конструктор, который либо не имеет параметров, либо имеет параметры, все параметры имеют значения по умолчанию.