变量有初始值设定项但是不完整类型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};。任何人都可以在这里指出我的错误。

+0

你几乎肯定不希望'mutable'在那里。 OTOH,PI应该是'static constexpr double'(如果你有不同的圆圈,你不需要PI的不同副本)。令人烦恼的是,您随后必须移动主要外部的圆的声明。最后,不要使用'namespace std;' –

当您在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

你不需要*'返回0;'在主结尾 - 但我会说这是不好的风格。我建议避免'使用名称空间标准;'和限定'cout'和'endl'。 –

+0

@MartinBonner:在一个简单的程序中忽略'main'中的'return'肯定不是一种不好的风格。相反,由于源代码主要与读者交流,因此在代码中处理失败的时候添加一个'return',否则就是向读者传递一个不真实的信息。那就是IMNSHO的意见,风格很差。 –

+0

我不同意。显式比隐式更好。 –

您没有定义名为circle的结构,您可以定义一个名为circle变量。该变量不能用作类型。

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

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

还有一些其他的问题,最显着的你不声明getArea功能const这意味着你不能把它的上const对象。