我在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中,并给出了构造函数的默认参数。
EDITED rectangle.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中时,它不会编译。
如果有人遇到此问题并找到了解决方法,请告诉我您是如何做到的。谢谢:))
答案 0 :(得分:5)
在第
行Rectangle box2; // no default constructor, error
您正在尝试调用Rectangle
的默认构造函数。编译器不再生成这样的默认构造函数,因为Rectangle
具有用户定义的构造函数,该构造函数接受2个参数。因此,您需要指定参数,例如
Rectangle box2(0,10);
编译代码时出现的错误是:
Rectangle.cpp:8:15:错误:没有匹配函数来调用&#39; Rectangle :: Rectangle()&#39; 矩形框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
通过这种方式,您可以使您的类具有Default-Constructible。
答案 1 :(得分:0)
只有在没有已定义的构造函数的情况下,才会生成编译器生成的默认构造函数。你定义了一个构造函数,所以如果你想要一个默认的构造函数,你必须自己提供它。可能最简单的(可以说)是通过在两个参数构造函数中使用默认参数来提供它:
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; }