变量具有初始值设定项,但不完整的类型C++

variable has initializer but incomplete type C++

本文关键字:C++ 类型 变量      更新时间:2023-10-16

我是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

错误在行const struct circle c1 = {2.0}; c1。谁能在这里指出我的错误。

你没有定义一个名为 circle 的结构,而是定义一个名为 circle变量。此变量不能用作类型。

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

const circle c1 = { 2.0 };
c1.radius = 7;
std::cout << c1.getArea() << 'n';

还有其他一些问题,最值得注意的是,您没有将getArea函数声明为 const这意味着您无法在const对象上调用它。

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

把它放在开头,在单词 struct 之后,以声明一个类型。

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 表达式,其中它产生可以更改其状态(捕获的值(的 lambda。