表达式必须具有类类型

时间:2013-02-22 05:55:56

标签: c++

我不希望这是我的第一篇文章,但我在这里不知所措。我在尝试编译程序时遇到这个错误(它应该只是找到矩形的区域和周长。)这是我的头文件。

#include <iostream>
using namespace std;

class Rectangle
{
public:
   Rectangle(float Lngth=1, float Wdth = 1);

   void setLngth(float Lngth);
   void setWdth(float Wdth);
   float getLngth(float Lngth);
    float getWdth(float Wdth);
    void Perimeter(float lngth, float wdth);
    void Area(float lngth, float wdth);
private:
    float Lngth;
    float Wdth;
};

这是我的.cpp文件。

#include <iostream>
using namespace std;

#include "RealRectangle.h" // Employee class definition


 Rectangle::Rectangle(float Lngth, float Wdth)
 {
&Rectangle::setLngth;
&Rectangle::setWdth;
 }
 void Rectangle::setLngth(float Lngth)
 {
      if((Wdth > 0.0) && (Wdth < 20.0))
       float wdth = Wdth;
        else
            cout<<"Invalid Width."<<endl;
 }

 float Rectangle::getLngth(float Lngth)
 {
     return Lngth;
 }

void Rectangle::setWdth(float Wdth)
{
     if((Wdth > 0.0) && (Wdth < 20.0))
       float wdth = Wdth;
        else
            cout<<"Invalid Width."<<endl;
}

float Rectangle::getWdth(float Wdth)
{
    return Wdth;
}

void Rectangle::Perimeter(float lngth, float wdth)
    {
        cout<<"The Perimeter is "<<(2*(lngth + wdth));
    }
void Rectangle::Area(float lngth, float wdth)
    {
        cout<<"The Area is "<<(lngth * wdth);
    }

这就是我一直遇到错误的地方。编译器告诉我添加一个&符号来创建指针,就像我在.cpp中所做的那样。但这会在它自己造成另一个错误。等等。我不确定我做错了什么。错误发生在第10行和第11行。

#include <iostream>
using namespace std;

#include "RealRectangle.h" 


int main()
{
    Rectangle rectangle1();
    Rectangle rectangle2();

    cout<<rectangle1.Perimeter();
    cout<<rectangle2.Area();
}

3 个答案:

答案 0 :(得分:2)

你已经遇到了被称为最令人烦恼的解析。

Rectangle rectangle1();
Rectangle rectangle2();

声明两个函数,而不是两个对象。做

Rectangle rectangle1;
Rectangle rectangle2;

此外,您应该将&Rectangle::setLngth更改为函数调用。

答案 1 :(得分:1)

Rectangle :: Perimeter()和Rectangle :: Area()属于void类型。他们不会退货。然而,您尝试使用其不存在的返回值并将其传递给cout

修改这两个函数,使它们返回一个值:

float Rectangle::Perimeter(float lngth, float wdth)
{
        return 2 * (lngth + wdth);
}

float Rectangle::Area(float lngth, float wdth)
{
        return lngth * wdth;
}

或修改你的main()函数来简单地调用这些函数,因为现在它们已经打印到cout

int main()
{
    Rectangle rectangle1;
    Rectangle rectangle2;

    rectangle1.Perimeter();
    rectangle2.Area();
}

但是你仍然有问题;这两个函数目前采用长度和宽度参数,我不认为这是你想要的。看来你想要的是获得矩形对象的周长和面积。所以你应该使用类变量来计算它。因此,请省略参数并使用您的私有数据成员:

float Rectangle::Perimeter()
{
        return 2 * (Lngth + Wdth);
}

float Rectangle::Area()
{
        return Lngth * Wdth;
}

不要忘记更新头文件中类声明中的函数签名,而不仅仅是cpp文件中的实现。

此外,构造函数不会正确委派初始化工作。函数调用的格式为function(arguments),而不是&function。所以你需要这样做:

Rectangle::Rectangle(float Lngth, float Wdth)
{
    setLngth(Lngth);
    setWdth(Wdth);
}

最后,您的Rectangle对象的声明被误解为函数原型:

Rectangle rectangle1();
Rectangle rectangle2();

编译器认为rectangle1rectangle2是不带参数并返回Rectangle的函数。你应该省略括号:

Rectangle rectangle1;
Rectangle rectangle2;

我们还没有完成(上帝,这个程序有多少错误:-P)。您的setLngthsetWdth功能未按预期运行:

void Rectangle::setLngth(float Lngth)
{
    if((Wdth > 0.0) && (Wdth < 20.0))
        float wdth = Wdth;
    else
        cout<<"Invalid Width."<<endl;
}

好好看看它。特别是那句话float wdth = Wdth;你的函数做了什么,取一个名为float的{​​{1}}参数,然后检查Lngth(私有变量)是否在范围内,如果它是,声明一个名为Wdth的新的本地float变量,并将其设置为与wdth相同的值。

该函数根本不初始化私有变量Wdth。您的Wdth功能也是如此。你也应该修复它们。

答案 2 :(得分:0)

此:

 Rectangle::Rectangle(float Lngth, float Wdth)
 {
&Rectangle::setLngth;
&Rectangle::setWdth;
 }

应该是这样的:

Rectangle::Rectangle(float Lngth, float Wdth)
{
    setLngth(Lngth);
    setWdth(Wdth);
}

而且:

Rectangle rectangle1();
Rectangle rectangle2();

应该是这样的:

Rectangle rectangle1;
Rectangle rectangle2;