c++ 不存在类的默认构造函数

k7fdbhmy  于 2023-04-13  发布在  其他
关注(0)|答案(5)|浏览(237)
#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[])
{
}

错误:智能感知:不存在类“Blowfish”的默认构造函数???!

de90aj5v

de90aj5v1#

如果你定义了一个没有任何构造函数的类,编译器会为你合成一个构造函数(这将是一个默认的构造函数--也就是说,一个不需要任何参数的构造函数)。但是,如果你定义了一个构造函数,(即使它确实接受了一个或多个参数)编译器将 * 不 * 为您合成构造函数--在这一点上,你已经承担了构造那个类的对象的责任,所以编译器“后退”,可以这么说,把这个工作留给你。
你有两个选择。你需要提供一个默认的构造函数,或者你需要在定义一个对象时提供正确的参数。例如,你可以改变你的构造函数,看起来像这样:

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等是操作模式,而不是真正的加密算法本身。称它们为算法不会打扰编译器,但 * 不合理地可能会给其他人阅读代码带来问题。

pes8fvy9

pes8fvy92#

因为你有这个:

Blowfish(BlowfishAlgorithm algorithm);

它不是一个 default 构造函数。默认构造函数是一个不带参数的构造函数。

Blowfish();
ygya80vv

ygya80vv3#

  • 默认构造函数是没有参数的构造函数,或者如果它有参数,所有参数都有默认值。*
xxb16uws

xxb16uws4#

你将构造函数Blowfish声明为:

Blowfish(BlowfishAlgorithm algorithm);

所以这一行不能存在(以后没有进一步的初始化):

Blowfish _blowfish;

因为你没有传递参数。它不知道如何处理对象Blowfish的无参数声明-你需要为此创建另一个构造函数。

**注意:**如果定义用户提供的构造函数,默认构造函数将消失。

idfiyjo8

idfiyjo85#

这是一个典型的人为错误。Intelisense要求这样做的原因之一是,您正在创建一个堆栈中没有参数的对象:

public:
Blowfish _blowfish;

这个声明需要一个默认的构造函数。纠正这个错误的一个方法是用new创建对象。

Blowfish myBlowfish = new Blowfish(algorithm);

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

相关问题