C ++消除函数并替换构造函数

时间:2013-11-17 21:58:47

标签: c++

我刚刚为构造函数和析构函数创建了第一个类,并且不太了解事情是如何工作的。我需要消除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;

    }

4 个答案:

答案 0 :(得分:2)

如果我正确理解了作业,您应该更改代码,以便代码不会直接调用setLengthsetWidth。您已经定义了构造函数,您只需要使用它。适当的解决方案是替换它:

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

进行调用