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

时间:2016-11-17 08:31:49

标签: c++ struct compiler-errors

我是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};。任何人都可以在这里指出我的错误。

2 个答案:

答案 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(捕获值)。