C++ 错误 : no matching constructor for initialization of

标签 c++ constructor matching

我正在练习 C++ 中的成员赋值,您可以在其中将一个对象的值设置为同一类的另一个对象。该程序的想法是用一些值初始化一个矩形对象并创建另一个矩形对象,但将第一个的值赋给第二个。

它给了我一个错误,它在下面发布,我无法弄清楚它是什么,它让我发疯,哈哈

这是我的 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.

编辑:这就是我让它工作的方式。我将所有内容都移到了 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 有一个用户定义的构造函数,它有两个参数。因此,您需要指定参数,例如

Rectangle box2(0,10);

我在编译你的代码时得到的错误是:

Rectangle.cpp:8:15: error: no matching function for call to 'Rectangle::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

通过这种方式,您可以让您的类默认构造。

关于C++ 错误 : no matching constructor for initialization of,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30271811/

相关文章:

python - networkx maximal_matching() 不返回最大匹配

c++ - 成员模板的别名模板

c++ - 如何拆分字符串并使用 boost::split 保留分隔符?

C++ "var foo = !!::bar()"语法?

Java递归匹配txt中的括号

java - 室友匹配算法

c++ - 寻找一种更有效的方法来在 C++ 中生成/打印 "progress bar"

c++ - 构造函数可以返回 NULL 值吗?

C++ 引用在函数范围内创建的实例

java - Kotlin 中的私有(private)构造函数