Für die Klasse existiert kein Standardkonstruktor

Für die Klasse existiert kein Standardkonstruktor

Wenn Sie eine Klasse ohne Konstruktor definieren, synthetisiert der Compiler einen Konstruktor für Sie (und das ist ein Standardkonstruktor – d. h. einer, der keine Argumente erfordert). Wenn Sie es jedoch tun einen Konstruktor definieren (selbst wenn er ein oder mehrere Argumente akzeptiert), wird der Compiler nicht einen Konstruktor für Sie synthetisieren -- an diesem Punkt haben Sie die Verantwortung für die Konstruktion von Objekten dieser Klasse übernommen, also tritt der Compiler sozusagen "zurück" und überlässt Ihnen diese Aufgabe.

Sie haben zwei Möglichkeiten. Sie müssen entweder einen Standardkonstruktor bereitstellen oder den richtigen Parameter angeben, wenn Sie ein Objekt definieren. Beispielsweise könnten Sie Ihren Konstruktor so ändern, dass er etwa so aussieht:

Blowfish(BlowfishAlgorithm algorithm = CBC);

...also könnte der ctor aufgerufen werden, ohne (explizit) einen Algorithmus anzugeben (in diesem Fall würde er CBC als Algorithmus verwenden).

Die andere Alternative wäre, den Algorithmus explizit anzugeben, wenn Sie ein Blowfish-Objekt definieren:

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

In C++ 11 (oder höher) steht Ihnen eine weitere Option zur Verfügung. Sie können Ihren Konstruktor definieren, der ein Argument akzeptiert, aber dann den Compiler anweisen, den Konstruktor zu generieren, den er hätte, wenn Sie keinen definieren würden:

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

Als letzte Anmerkung denke ich, dass es erwähnenswert ist, dass ECB, CBC, CFB usw. Betriebsmodi sind, nicht wirklich Verschlüsselungsalgorithmen selbst. Sie als Algorithmen zu bezeichnen, wird den Compiler nicht stören, ist es aber unangemessen wahrscheinlich ein Problem für andere verursachen, die den Code lesen.


Weil Sie dies haben:

Blowfish(BlowfishAlgorithm algorithm);

Es ist kein Standard Konstrukteur. Der Standardkonstruktor ist einer, der keine Parameter akzeptiert. d.h.

Blowfish();

Ein Standardkonstruktor ist ein Konstruktor, der entweder keine Parameter hat, oder wenn er Parameter hat, alle Parameter Standardwerte haben.