C++ 错误:没有用于初始化的匹配构造函数

Posted

技术标签:

【中文标题】C++ 错误:没有用于初始化的匹配构造函数【英文标题】:C++ error: no matching constructor for initialization of 【发布时间】:2015-07-28 02:30:44 【问题描述】:

我正在练习 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 中时,它不会编译。

如果有人遇到此问题并找到了解决方案,请告诉我您是如何解决的。谢谢:)

【问题讨论】:

【参考方案1】:

排队

Rectangle box2; // no default constructor, error

您正在尝试调用Rectangle 的默认构造函数。编译器不再生成这样的默认构造函数,因为您的 Rectangle 有一个用户定义的构造函数,它接受 2 个参数。因此,您需要指定参数,例如

Rectangle box2(0,10);

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

Rectangle.cpp:8:15: 错误:没有匹配函数调用'Rectangle::Rectangle()' 矩形框2;

一种解决方案是为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++ 中总是这样吗? @skipper 是的。但是,如果您提供默认参数,您的用户定义构造函数也可以是默认构造函数,因此无需提供 2 个不同的构造函数。默认构造函数是允许在没有参数的情况下调用的任何构造函数。更多详情请查看here。【参考方案2】:

仅当您没有定义的构造函数时才会生成编译器生成的默认构造函数。你定义了一个构造函数,所以如果你想要一个默认构造函数,你必须自己提供它。可能最简单(可以说)是通过在两个参数构造函数中使用默认参数来提供它:

Rectangle(double l=0, double w=0)

您还应该使用inline 关键字,如下所示,否则您可能会发现链接器错误:

inline Rectangle::Rectangle(double l, double w) 
    length = l;
    width = w;


inline double Rectangle::getWidth() const  return width; 
inline double Rectangle::getLength() const  return length; 

【讨论】:

默认构造函数不应该没有参数吗? @skipper:默认构造函数应该被调用,不带参数。所有默认参数都满足这一点。 我无法通过在 rectangle.h 中添加默认参数来使其工作。但是,我将类和成员函数定义移动到了 rectangle.cpp 并且使用默认参数可以正常工作。所以,它是一个解决方案,但不是一个真正令人满意的解决方案,因为我将来可能会面临同样的问题而没有解决方案。

以上是关于C++ 错误:没有用于初始化的匹配构造函数的主要内容,如果未能解决你的问题,请参考以下文章

C++ 使用继承时没有匹配的构造函数

错误:在 C++ 中没有用于调用构造函数的匹配函数

创建对象数组,没有匹配的构造函数初始化错误

没有用于使用 VSTGUI 初始化“AEffGUIEditor”的匹配构造函数

没有匹配的初始化构造函数

C++初始化列表构造函数VS普通构造函数