我刚刚为构造函数和析构函数创建了第一个类,并且不太了解事情是如何工作的。我需要消除Rectangle类的setWidth和setLength函数,并用构造函数替换它们。任何人都可以帮助我吗?!
这是我到目前为止所做的:
class Rectangle {
public:
Rectangle(double=1.0, double=1.0); // Constructor
double perimeter(void);
double area(void);
void setWidth(double w);
void setLength(double l);
double getWidth(void);
double getLength(void);
private:
double length;
double width;
};
// Constructor
Rectangle::Rectangle(double w, double l)
{
setWidth(w);
setLength(l);
}
double Rectangle::area(void)
{
return length * width;
}
double Rectangle::perimeter(void)
{
return 2*(length+width);
}
void Rectangle::setWidth(double w)
{
if ( w> 0 && w < 20.0)
width=w;
else
width=1.0;
}
void Rectangle::setLength(double l)
{
length= l > 0 && l < 20.0 ? l : 1.0;
}
double Rectangle::getWidth(void)
{
return width;
}
double Rectangle::getLength(void)
{
return length;
}
int main()
{
Rectangle R;
R.setLength(5);
R.setWidth(4);
cout << R.area() << endl;
cout << R.perimeter() << endl;
Rectangle* pR = new Rectangle;
pR -> setLength(10);
pR -> setWidth(5);
cout << pR->area() << endl; // Call the area() function using pR
cout << pR->perimeter() << endl; // Call the perimeter() function using pR
delete pR;
}
答案 0 :(得分:2)
如果我正确理解了作业,您应该更改代码,以便代码不会直接调用setLength
和setWidth
。您已经定义了构造函数,您只需要使用它。适当的解决方案是替换它:
Rectangle R;
R.setLength(5);
R.setWidth(4);
用这个:
Rectangle R(4, 5);
另外,要替换它:
Rectangle* pR = new Rectangle;
pR -> setLength(10);
pR -> setWidth(5);
用这个:
Rectangle* pR = new Rectangle(5, 10);
“技巧”(对于你,作为初学者)是要知道为什么参数的顺序是(4,5),而不是(5,4)。如果你知道为什么,那么教训就结束了。
答案 1 :(得分:0)
您可以从构造函数中直接以几种方式初始化内部变量的值:
选项#1
Rectangle::Rectangle(double w, double l)
{
width = w;
length = l;
}
选项#2
Rectangle::Rectangle(double w, double l) :
width(w),
length(l)
{
}
注意:如果我没记错,直到构造函数本身内部才会出现指向“this”的指针。因此,如果您的Rectangle类是从“Shape”类派生的,并且您需要在Rectangle构造函数调用中初始化Shape(...)构造函数(您可以在Option#2中执行,将参数传递给基类构造函数),不要从矩形实例传入“this”指针;它还没有定义。为此,您将需要一个基类函数,如“set derived class pointer”。你可能不应该这样做,但如果你这样做,请小心。
e.g。
Rectangle::Rectangle(double w, double l) :
length(w),
width(l),
Shape(this) // I don't believe you can do this.
{
}
这有用吗?
答案 2 :(得分:0)
似乎可能要求宽度和长度都必须大于0且小于20;这是在setWidth和setLength成员函数中强制执行的。但是,在构造函数中使用初始化列表是更好的样式。我将添加一个函数来将值限制为所需的范围,并在构造函数和setXXX函数中使用它:
class Rectangle {
public:
Rectangle(double w, double l)
: width(limit(w)), length(limit(l)) {
}
void setWidth(double w) {
width = limit(w);
}
void setLength(double l) {
length = limit(l);
}
private:
double limit(double value) { return 0 < value && value < 20 ? value : 1.0; }
};
请注意,我还删除了构造函数的默认参数。这部分是风格问题:如果要求默认值为1.0,请将它们放回去,但这些值对我来说看起来很随意。同样,limit
中的1.0看起来是任意的;如果要求值在范围内,则可能更适合抛出异常(如果不是。)
答案 3 :(得分:-1)
Rectangle(double w= 1.0, double l= 1.0);
头文件中的
Rectangle::Rectangle(double w, double l)
{
if ( w> 0 && w < 20.0)
width=w;
else
width=1.0;
length= l > 0 && l < 20.0 ? l : 1.0;
}
在cpp文件中
主要使用Rectangle R(12,5);