C++ error: no matching constructor for initialization of

In memberwise assignment in C++, you can set the values of one object to another object of the same class. I initialize a rectangle object with some values and create another rectangle object but assign the value of the first into the second.

It's giving me an error. Why?

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; } 

Error when I compile:

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. 
1

2 Answers

In the line

Rectangle box2; // no default constructor, error 

you are trying to invoke the default constructor of Rectangle. The compiler does not generate such a default constructor anymore, because your Rectangle has a user defined constructor that takes 2 parameters. Therefore, you need to specify the parameters, like

Rectangle box2(0,10); 

The error I get when compiling your code is:

Rectangle.cpp:8:15: error: no matching function for call to 'Rectangle::Rectangle()' Rectangle box2;

A solution is to create a default constructor for Rectangle, since it is not automatically generated anymore due to your user defined one:

Rectangle(); // in Rectangle.h Rectangle::Rectangle(){} // in Rectangle.cpp (or Rectangle::Rectangle() = default; in C++11) 

Another solution (and the preferable one, since it doesn't leave the data un-initialized) is to assign default arguments to your existing constructor.

Rectangle::Rectangle(double l = 0, double w = 0); // only in Rectangle.h 

In this way, you make your class Default-Constructible.

2

A compiler generated default constructor is only generated if you have no defined constructors. You define a constructor, so if you want a default constructor you have to provide it yourself. Probably the easiest (arguably) is to provide it by using default arguments in your two argument constructor:

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

Also you should use the inline keyword as shown below or you may find you get linker errors:

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; } 
3

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like