我是C ++的新手。我有这个代码来创建一个结构,以显示C ++中mutable
关键字的用法。
#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};
。任何人都可以在这里指出我的错误。
答案 0 :(得分:7)
您没有定义名为circle
的结构,您可以定义名为circle
的变量。此变量不能用作类型。
你应该做,例如struct circle { ... };
将结构定义为类型。然后你可以做
const circle c1 = { 2.0 };
c1.radius = 7;
std::cout << c1.getArea() << '\n';
还有一些其他问题,最值得注意的是,您没有将getArea
函数声明为const
,这意味着您无法在const
个对象上调用它。
答案 1 :(得分:5)
当您在circle
定义的末尾将右侧括号后面的名称struct
添加时,您就会声明变量。
将其放在单词struct
之后的开头,以声明类型。
即
struct circle
{
// ...
};
在其他新闻中:
您需要将getArea()
声明为const
才能在const
个实例上调用它,即double getArea() const
。
您最后不需要return 0;
,因为这是main
的默认设置。其他功能没有此类默认值。 main
很特别。
为了使用cout
不合格(您似乎想要),您可以在代码的开头添加using namespace std;
;它通常放在包含之后。
mutable
通常不会用于允许外部代码将对象的一部分视为非const
。
相反,它被用作设备,当对象看起来像const
时更容易让类实现具有一些非const
状态外码。这称为逻辑constness 。例如,对象可能会缓存昂贵计算的结果,即使它是const
。
在C ++ 17及更高版本中mutable
也可以应用于lambda表达式,在这里它产生一个可以改变其状态的lambda(捕获值)。