41
#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」のデフォルトコンストラクターは存在しません???!

4

5 に答える 5

66

コンストラクターなしでクラスを定義すると、コンパイラーがコンストラクターを合成します(これがデフォルトのコンストラクターになります。つまり、引数を必要としないコンストラクターになります)。ただし、コンストラクターを定義する場合(1つ以上の引数をとる場合でも)、コンパイラーはコンストラクターを合成しません。その時点で、そのクラスのオブジェクトを作成する責任はユーザーにあるため、コンパイラーは、いわば「後退」し、その仕事をあなたに任せます。

2つの選択肢があります。デフォルトのコンストラクターを提供するか、オブジェクトを定義するときに正しいパラメーターを指定する必要があります。たとえば、コンストラクターを次のように変更できます。

Blowfish(BlowfishAlgorithm algorithm = CBC);

...したがって、ctorは、アルゴリズムを(明示的に)指定せずに呼び出すことができます(この場合、アルゴリズムとしてCBCを使用します)。

もう1つの方法は、Blowfishオブジェクトを定義するときにアルゴリズムを明示的に指定することです。

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

C ++ 11(またはそれ以降)では、もう1つのオプションを使用できます。引数を取るコンストラクターを定義できますが、コンストラクターを定義しなかった場合のコンストラクターを生成するようにコンパイラーに指示します。

class GameCryptography { 
public:

    // define our ctor that takes an argument
    GameCryptography(BlofishAlgorithm); 

    // Tell the compiler to do what it would have if we didn't define a ctor:
    GameCryptography() = default;
};

最後に、ECB、CBC、CFBなどは操作モードであり、実際には暗号化アルゴリズム自体ではないことを言及する価値があると思います。それらをアルゴリズムと呼んでもコンパイラーは気になりませんが、コードを読んでいる他の人に問題を引き起こす可能性があります

于 2011-02-12T23:26:17.903 に答える
7

あなたがこれを持っているので:

Blowfish(BlowfishAlgorithm algorithm);

これはデフォルトのコンストラクターではありません。デフォルトのコンストラクターは、パラメーターを受け取らないコンストラクターです。すなわち

Blowfish();
于 2011-02-12T23:16:16.337 に答える
5

デフォルトのコンストラクターは、パラメーターがないか、パラメーターがある場合はすべてのパラメーターにデフォルト値があるコンストラクターです。

于 2011-02-12T23:15:26.273 に答える
4

コンストラクターblowfishを次のように宣言しました。

Blowfish(BlowfishAlgorithm algorithm);

したがって、この行は存在できません(後でさらに初期化する必要があります)。

Blowfish _blowfish;

パラメータを渡さなかったため。オブジェクト「BlowFish」のパラメータなしの宣言を処理する方法を理解していません。そのために別のコンストラクタを作成する必要があります。

于 2011-02-12T23:16:09.100 に答える
0

これは典型的なヒューマンエラーです。Intelisenseは1つの理由でそれを求めています、あなたはスタックにパラメータなしでオブジェクトを作成しています:

public:
Blowfish _blowfish;

その宣言にはデフォルトのコンストラクターが必要です。これを修正する1つのオプションは、newでオブジェクトを作成することです。

Blowfish myBlowfish = new Blowfish(algorithm);

2番目のオプションは、要求に応じてデフォルトのコンストラクターを作成することです。

于 2021-11-05T08:18:11.347 に答える