变量有初始值设定项但是不完整类型C++
我是C++新手。我有这个代码来创建一个结构,以显示在C++中使用mutable
关键字。变量有初始值设定项但是不完整类型C++
#include <iostream>
using namespace std;
int main()
{
struct
{
mutable double radius;
double PI = 3.142;
double getArea()
{
return (PI * radius * radius);
}
} circle;
const struct circle c1 = {2.0};
circle.radius = 7;
cout << "Area is " << circle.getArea() << endl;
return 0;
}
但是编译时,我得到了以下错误消息:
error: variable const main()::circle c1 has initializer but incomplete type
误差在c1
在该行const struct circle c1 = {2.0};
。任何人都可以在这里指出我的错误。
当您在struct
定义末尾的右大括号后面输入名称circle
时,您声明了一个变量。
把它放在开头,在struct
这个单词后面,声明一个类型。
I.e.
struct circle
{
// ...
};
其他消息:
你需要申报
getArea()
为const
能够称之为一个const
实例,即double getArea() const
。最后不需要
return 0;
,因为这是main
的默认值。其他功能没有这样的默认值。main
是特别的。为了使用不合格的
cout
(看起来你想要),你可以在代码的开头添加using namespace std;
;它通常放在包含之后。
mutable
通常不用于允许外代码以治疗对象的一部分一如既往非const
。
相反它用作设备更容易地让一个类的实现有一些非const
状态也当对象似乎是const
到外部代码。这就是所谓的逻辑常量。例如,对象可能会缓存昂贵的计算结果,即使它是const
。
在C++中17和后mutable
也可以应用于lambda表达式,在那里它产生的λ,可以改变它的状态(捕获的值)。
你不需要*'返回0;'在主结尾 - 但我会说这是不好的风格。我建议避免'使用名称空间标准;'和限定'cout'和'endl'。 –
@MartinBonner:在一个简单的程序中忽略'main'中的'return'肯定不是一种不好的风格。相反,由于源代码主要与读者交流,因此在代码中处理失败的时候添加一个'return',否则就是向读者传递一个不真实的信息。那就是IMNSHO的意见,风格很差。 –
我不同意。显式比隐式更好。 –
您没有定义名为circle
的结构,您可以定义一个名为circle
的变量。该变量不能用作类型。
你应该做struct circle { ... };
将结构定义为一种类型。然后,你可以做
const circle c1 = { 2.0 };
c1.radius = 7;
std::cout << c1.getArea() << '\n';
还有一些其他的问题,最显着的你不声明getArea
功能const
这意味着你不能把它的上const
对象。
你几乎肯定不希望'mutable'在那里。 OTOH,PI应该是'static constexpr double'(如果你有不同的圆圈,你不需要PI的不同副本)。令人烦恼的是,您随后必须移动主要外部的圆的声明。最后,不要使用'namespace std;' –