Для класса нет конструктора по умолчанию

#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

Конструктор по умолчанию - это конструктор, который либо не имеет параметров, либо имеет параметры, все параметры имеют значения по умолчанию.