变量具有初始化程序但不完整的类型C++

Thi*_*ruG 1 c++ struct compiler-errors

我是C++的新手.我有这个代码来创建一个结构,以显示mutableC++ 中关键字的用法.

#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;
}
Run Code Online (Sandbox Code Playgroud)

但是在编译时我收到以下错误消息:

error: variable const main()::circle c1 has initializer but incomplete type
Run Code Online (Sandbox Code Playgroud)

错误在于c1该行const struct circle c1 = {2.0};.任何人都可以在这里指出我的错误.

Som*_*ude 7

您没有定义名为的结构circle,您定义了一个名为的变量circle.此变量不能用作类型.

您应该例如struct circle { ... };将结构定义为类型.然后你可以做到

const circle c1 = { 2.0 };
c1.radius = 7;
std::cout << c1.getArea() << '\n';
Run Code Online (Sandbox Code Playgroud)

还有一些其他问题,最值得注意的是你没有声明getArea函数,const这意味着你不能在const对象上调用它.


Che*_*Alf 5

当您将名称放在定义circle末尾的右大括号后面时struct,您将声明一个变量.

把它放在单词后面的开头struct,以声明一个类型.

struct circle
{
    // ...
};
Run Code Online (Sandbox Code Playgroud)

在其他新闻中:

  • 你需要声明getArea()const是能够把它叫做一个const实例,即double getArea() const.

  • return 0;最后不需要,因为这是默认值main.其他功能没有此类默认值.main很特别.

  • 为了使用cout不合格(你似乎想要),你可以using namespace std;在代码的开头添加; 它通常放在包含之后.


mutable通常不用于允许外部代码将对象的一部分视为非常const.

相反,它被用作设备,const当对象看起来是const外部代码时,更容易让类实现具有一些非状态.这就是所谓的逻辑常量.例如,对象可能会缓存昂贵计算的结果,即使它是const.

在C++中,17及更高版本mutable也可以应用于lambda表达式,在这里它产生一个可以改变其状态的lambda(捕获值).