这个C ++类有什么问题?

时间:2018-04-08 16:50:37

标签: c++

这是我到目前为止的代码:

#include <iostream>
using namespace std;

class Rectangle
{
private:
    double width, height;
public:
    Rectangle();
    double Set(double x, double y);
    double getArea();
    double getPerimeter();
};

Rectangle::Rectangle()
{
    width = 1;
    height = 1;
}

double Rectangle::Set(double x, double y)
{
    width = x;
    height = y;
}

double Rectangle::getArea()
{
    double area = height * width;
    return area;
}

double Rectangle::getPerimeter()
{
    double perimeter = (width * 2) + (height * 2);
    return perimeter;
}

int main()
{
    double width, height;
    cout << "Enter the width and height of a rectangle:";
    cin >> width >> height;
    cout << "The area is " << Rectangle::getArea << " and the perimeter is " << Rectangle::getPerimeter << endl;
}

运行此代码时,我收到错误:“'Rectangle :: getArea':非标准语法;使用'&amp;'创建指向成员的指针“ 我得到了关于Rectangle :: getPerimeter的相同错误 我不知道问题是什么,我很擅长用C ++编写课程,所以我遇到了一些麻烦。有什么建议吗?

3 个答案:

答案 0 :(得分:2)

首先创建Rectangle()类的对象,然后调用相应的方法。

Rectangle rect;/* object of rectangle class */

您的main()看起来像

int main() {
        double width, height;
        cout << "Enter the width and height of a rectangle:";
        cin >> width >> height;
        Rectangle rect;/* object of rectangle class */
        /* calling set method and passing the parameter */
        rect.Set(width,height);
        cout << "The area is " << rect.getArea() << " and the perimeter is " << rect.getPerimeter() << endl;
        return 0;
}

如果我理解正确,你实际上并不需要Set()方法,而是通过传递参数来使用构造函数执行相同的操作。

参数化构造函数而不是Set()方法

Rectangle::Rectangle(double x, double y) {
        width = x;
        height = y;
}

创建像

这样的对象
Rectangle rect(width,height);/* it will be called automatically */

答案 1 :(得分:1)

对于初学者,此成员函数不返回任何内容

double Rectangle::Set(double x, double y)
{
    width = x;
    height = y;
}

所以它应该被定义为

void Rectangle::Set(double x, double y)
{
    width = x;
    height = y;
}

看来你的意思是

//...
cin >> width >> height;
Rectangle r;
r.Set( width, height );

cout << "The area is " << r.getArea() << " and the perimeter is " << r.getPerimeter() << endl;

函数getAreagetPerimeter应声明为常量成员函数

double getArea() const;
double getPerimeter() const;

因为它们不会更改Rectangle类型的对象。

如果类具有带两个参数的构造函数

,那将是逻辑一致的
Rectangle( double width, double height );

方法Set应该分为两个方法,如setWidthsetHeight

答案 2 :(得分:1)

您的代码存在一些问题。

1。)您永远不会实例化该类(即创建该类类型的对象。)具有名称widthheight的两个变量与具有该类型的对象不同矩形。

2。)您正在尝试将非静态成员函数调用为静态成员函数。例如,通过对象调用成员函数 rect.getArea()其中rectRectangle类型的对象。

3.)您在函数调用中缺少括号。每当您收到消息non-standard syntax, use & to create a pointer to a member时,通常意味着您在函数调用时忘记了括号。

你想要的可能是:

int main()
{
    double width, height;
    cout << "Enter the width and height of a rectangle:";
    cin >> width >> height;
    Rectangle rect;
    rect.Set(width, height);
    cout << "The area is " << rect.getArea() << " and the perimeter is " << rect.getPerimeter() << endl;
}