1. ホーム
  2. c++

[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。

2022-01-21 08:40:14

質問

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にするのです。