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

如果您定义一个没有任何构造函数的类,编译器将为您合成一个构造函数(这将是一个默认构造函数——即不需要任何参数的构造函数)。但是,如果您确实定义了一个构造函数(即使它确实有一个或多个参数),编译器将不会为您合成一个构造函数——此时,您已经负责构造该类的对象,所以编译器“退后一步”,可以这么说,把这项工作留给你。

你有两个选择。您需要提供默认构造函数,或者在定义对象时需要提供正确的参数。例如,您可以将构造函数更改为如下所示:

Blowfish(BlowfishAlgorithm algorithm = CBC);

...因此可以在不(明确)指定算法的情况下调用 ctor(在这种情况下,它将使用 CBC 作为算法)。

另一种选择是在定义 Blowfish 对象时显式指定算法:

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

在 C++ 11(或更高版本)中,您还有一个可用选项。您可以定义带参数的构造函数,然后告诉编译器生成如果您没有定义它会拥有的构造函数:

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);

它不是默认构造函数。默认构造函数是不带参数的构造函数。IE

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 要求这样做的原因之一是,您正在堆栈中创建一个没有参数的对象:

public:
Blowfish _blowfish;

该声明需要一个默认构造函数。解决此问题的一种方法是使用 new 创建对象。

Blowfish myBlowfish = new Blowfish(algorithm);

第二个选项是根据要求创建默认构造函数。

于 2021-11-05T08:18:11.347 回答