[解決済み] クラスにデフォルトコンストラクタが存在しない。
質問
#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[])
{
}
Error:IntelliSense: no default constructor exists for class "Blowfish" ?!!!
解決方法は?
コンストラクタのないクラスを定義すると、コンパイラがコンストラクタを合成してくれます(そのコンストラクタはデフォルトコンストラクタ、つまり引数を必要としないコンストラクタになります)。しかし、もし する コンストラクタを定義すると、(たとえそれが 1 つ以上の引数を取るとしても)コンパイラは ない その時点で、あなたはそのクラスのオブジェクトを構築する責任を負ったことになり、コンパイラはいわば一歩下がって、その仕事をあなたに任せることになるのです。
選択肢は2つです。デフォルトのコンストラクタを用意するか、オブジェクトを定義するときに正しいパラメータを指定する必要があります。たとえば、コンストラクタを次のようなものに変更することができます。
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などは動作モードであって、暗号化アルゴリズムそのものではないことを述べておきます。これらをアルゴリズムと呼んでもコンパイラは困りませんが は 他の人がコードを読むときに問題を起こす可能性が高いです。
関連
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み] C++で、あるコンストラクタを別のコンストラクタから呼び出す(コンストラクタ・チェイニングを行う)ことは可能ですか?
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] Pythonで静的なクラス変数は可能ですか?
-
[解決済み] C#でベースコンストラクタを呼び出す
-
[解決済み] Could not find or load main class "とはどういう意味ですか?
-
[解決済み] コンストラクタ内の仮想メンバー呼び出し
-
[解決済み] あるコンストラクタを別のコンストラクタから呼び出す
-
[解決済み] ベースクラスのコンストラクタを呼び出す際のルールは?
-
[解決済み] 抽象クラスはコンストラクタを持つことができますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません