[解決済み] クラスエラーに対応するデフォルトコンストラクタが存在しない
2022-02-28 03:22:16
質問
簡単なコードです。
class Thing {
public:
int num;
Thing(int num) {
this->num = num;
}
};
class Stuff {
public:
Thing thing; // an instance of thing is declared here but it cannot construct it
Stuff(Thing thing) {
this->thing = thing;
}
};
int main() {
Thing thing = Thing(5);
Stuff stuff = Stuff(thing);
}
ここでは、Stuffに自分自身のコピーを保持させたいので、StuffのコンストラクタでThingの新しいインスタンスを指すことなく取得する方法について考えているところです。もちろん、thingを初期化しようとしているので、上記のように宣言することはできない。
コンストラクタを通じてクラスの変数に新しいオブジェクトのコピーを代入するこの問題は、どうすれば回避できるのでしょうか?
正確なエラーは
In constructor 'Stuff::Stuff(Thing)':
error: no matching function for call to 'Thing::Thing()'
Stuff(Thing thing){ this->thing = thing; }
candidate expects 1 argument, 0 provided
解決方法は?
問題はここです。
Stuff(Thing thing) {
this->thing = thing;
}
コンストラクタの本体に入るまでに、コンパイラはすでにオブジェクトのデータ・メンバを初期化しています。 しかし
thing
なぜなら、デフォルトのコンストラクタを持たないからです。
解決策は、コンパイラに初期化方法を伝えるために イニシャライザーリスト .
Stuff(Thing thing) : thing(thing) {
// Nothing left to do.
}
この方が型付けが少なく、コードもすっきりして、効率的です。 (より効率的というのは、変数がどうせ初期化されるのなら、最初に不要な値で初期化して、できるだけ早く別の値を代入する必要はないでしょう? もちろん、今のコードはコンパイルすらできないので、「より効率的」というのはいささか疑わしい表現ですが...)
関連
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み] C++で、あるコンストラクタを別のコンストラクタから呼び出す(コンストラクタ・チェイニングを行う)ことは可能ですか?
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] C#でベースコンストラクタを呼び出す
-
[解決済み] コンストラクタ内の仮想メンバー呼び出し
-
[解決済み] あるコンストラクタを別のコンストラクタから呼び出す
-
[解決済み] ベースクラスのコンストラクタを呼び出す際のルールは?
-
[解決済み] 抽象クラスはコンストラクタを持つことができますか?
最新
-
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++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み】std::cin.getline( ) vs. std::cin