【发布时间】:2017-12-03 19:48:19
【问题描述】:
我写了一个简单的C++程序,如下-
#include<iostream>
using namespace std;
class Rectangle
{
double length, breadth;
public:
Rectangle(void); // constructor overloading
Rectangle(double, double); // constructor of class
// void set_values(double l, double b);
double area(void);
}; // can provide an object name here
// default constructor of class 'Rectangle'-
Rectangle::Rectangle(void)
{
length = 5;
breadth = 5;
}
// constructor of class 'Rectangle'-
Rectangle::Rectangle(double l, double b)
{
length = l;
breadth = b;
}
/*
void Rectangle::set_values(double l, double b)
{
length = l;
breadth = b;
}
*/
double Rectangle::area(void)
{
return length * breadth;
}
int main()
{
/*
Rectangle r;
r.set_values(12, 3.4);
*/
Rectangle r(12, 3.4);
Rectangle s();
cout<<"Area = "<<r.area()<<endl;
cout<<"Area = "<<s.area()<<endl;
return 0;
}
当我尝试编译它时,我收到以下错误-
Classes_Example.cpp: In function ‘int main()’:
Classes_Example.cpp:61:21: error: request for member ‘area’ in ‘s’, which is of non-class type ‘Rectangle()’
cout<<"Area = "<<s.area()<<endl;
我正在使用 g++ (GCC) 7.2.0
谢谢!
【问题讨论】:
-
Rectangle s();是一个函数声明。 -
Most vexing parse。我们真的需要一个规范的问答条目。我很惊讶我找不到。
-
Rectangle s();声明了一个名为s的函数,它不接受任何参数并返回一个Rectangle。这被称为 C++ 中最令人头疼的解析。将其更改为Rectangle s;或Rectangle s{};。 -
@Cornstalks,我也在想同样的事情。
-
您应该始终使用list initialization。大多数令人烦恼的解析没有问题只是它的好处之一。
标签: c++