[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
質問
C++でメンバーワイズアサイン(あるオブジェクトの値を同じクラスの別のオブジェクトに設定すること)を練習しています。このプログラムのアイデアは、ある値で矩形オブジェクトを初期化し、別の矩形オブジェクトを作成し、最初の値を2番目のオブジェクトに代入することです。
そのため、下に掲載されているようなエラーが発生し、それが何なのかがわからず、気が狂いそうです(笑)
これは私のRectangle.hです。
#ifndef RECTANGLE_H
#define RECTANGLE_H
class Rectangle {
private:
double length;
double width;
public:
Rectangle(double, double);
double getLength() const;
double getWidth() const;
};
Rectangle::Rectangle(double l, double w) {
length = l;
width = w;
}
double Rectangle::getWidth() const { return width; }
double Rectangle::getLength() const { return length; }
#endif
これは私のRectangle.cppです。
#include <iostream>
#include "rectangle.h"
using namespace std;
int main()
{
Rectangle box1(10.0, 10.0);
Rectangle box2;
cout << "box1's width and length: " << box1.getWidth() << ", " << box1.getLength() << endl;
cout << "box2's width and length: " << box2.getWidth() << ", " << box2.getLength() << endl;
box2 = box1;
cout << "box1's width and length: " << box1.getWidth() << ", " << box1.getLength() << endl;
cout << "box2's width and length: " << box2.getWidth() << ", " << box2.getLength() << endl;
return 0;
}
コンパイルするとこのようなエラーになります。
skipper~/Desktop/Programming/Memberwise: g++ rectangle.cpp
rectangle.cpp:7:12: error: no matching constructor for initialization of
'Rectangle'
Rectangle box1(10.0, 10.0);
^ ~~~~~~~~~~
./rectangle.h:4:7: note: candidate constructor (the implicit copy constructor)
not viable: requires 1 argument, but 2 were provided
class Rectangle {
^
./rectangle.h:4:7: note: candidate constructor
(the implicit default constructor) not viable: requires 0 arguments, but 2
were provided
1 error generated.
EDIT: このようにして、私はそれを動作させることができました。すべてをrectangle.cppに移動して、コンストラクタにデフォルトの引数を与えました。
編集された矩形波.cpp
#include <iostream>
using namespace std;
class Rectangle {
private:
double length;
double width;
public:
//Rectangle();
Rectangle(double = 0.0, double = 0.0);
double getLength() const;
double getWidth() const;
};
int main()
{
Rectangle box1(10.0, 10.0);
Rectangle box2;
cout << "box1's width and length: " << box1.getWidth() << ", " << box1.getLength() << endl;
cout << "box2's width and length: " << box2.getWidth() << ", " << box2.getLength() << endl;
box2 = box1;
cout << "box1's width and length: " << box1.getWidth() << ", " << box1.getLength() << endl;
cout << "box2's width and length: " << box2.getWidth() << ", " << box2.getLength() << endl;
return 0;
}
Rectangle::Rectangle(double l, double w) {
length = l;
width = w;
}
double Rectangle::getWidth() const { return width; }
double Rectangle::getLength() const { return length; }
私が行った唯一の変更は、ユーザー定義のコンストラクタにデフォルトの引数を与えたことです。しかし、その変更がrectangle.hにあると動作しませんでした。しかし、クラスとメンバー関数の定義をrectangle.cppに移動すると、動作するようになりました。つまり、クラスとメンバ関数の定義がrectangle.hにあるときはコンパイルできないという本当の問題には対処していないのです。
この問題に直面したことのある方、解決策を見つけた方がいらっしゃいましたら、どのようにしたのか教えてください。ありがとうございます :)
解決方法を教えてください。
行内
Rectangle box2; // no default constructor, error
のデフォルトコンストラクタを呼び出そうとしています。
Rectangle
. コンパイラはもうそのようなデフォルトコンストラクタを生成しません。
Rectangle
には、2 つのパラメータを受け取るユーザー定義のコンストラクタがあります。そのため、次のようにパラメータを指定する必要があります。
Rectangle box2(0,10);
あなたのコードをコンパイルするときに出るエラーは。
Rectangle.cpp:8:15: error: no matching function for call to 'Rectangle::Rectangle()' 長方形 box2;
のデフォルトコンストラクタを作成することで解決できます。
Rectangle
というのも、ユーザー定義のものがあるため、自動生成されなくなったからです。
Rectangle(); // in Rectangle.h
Rectangle::Rectangle(){} // in Rectangle.cpp (or Rectangle::Rectangle() = default; in C++11)
もうひとつの解決策 (データが初期化されないので望ましい) は、既存のコンストラクタにデフォルトの引数を割り当てることです。
Rectangle::Rectangle(double l = 0, double w = 0); // only in Rectangle.h
このようにして、クラスをDefault-Constructibleにするのです。
関連
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み] 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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み] テスト
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の