c ++中的静态const double

Cry*_*tal 10 c++ static

这是使用静态const变量的正确方法吗?在我的顶级课程(形状)

#ifndef SHAPE_H
#define SHAPE_H

class Shape
{
public:

    static const double pi;
private:
    double originX;
    double originY;
};

const double Shape::pi = 3.14159265;

#endif
Run Code Online (Sandbox Code Playgroud)

然后在一个扩展Shape的类中,我使用Shape :: pi.我收到链接器错误.我将const double Shape :: pi = 3.14 ...移动到Shape.cpp文件,然后我的程序编译.为什么会这样?谢谢.

Pot*_*ter 12

必须在源文件中定义和初始化静态浮点数据成员.单定义规则禁止class {}在标题中的块外部定义,并且只允许在class {}块内初始化整数数据成员.

这也是不幸的,因为作为一个代数值,拥有即时值可能对优化很有用,而不是从全局变量加载.(但差异很可能是无关紧要的.)

但是有一个解决方案!

class Shape
{
public:
    static double pi()
        { return 3.14159265; }

private:
    double originX;
    double originY;
};
Run Code Online (Sandbox Code Playgroud)

class{}块内允许内联函数定义,包括静态函数定义.

另外,我建议使用M_PIfrom <math.h>,你也应该从中获取<cmath>.

  • @Justin:除了额外的复杂功能之外,我认为`template`不会让你感到满意. (2认同)

R S*_*hko 11

因为const double Shape::pi = 3.14159265;Shape::piC++ 的定义而且只允许单个符号定义(称为单定义规则,您可以在其中看到它的首字母缩写形式ODR).当定义在头文件中时,每个翻译单元都会获得它自己的定义,从而打破该规则.

通过将其移动到源文件中,您只能获得一个定义.


Ben*_*min 9

如果你有办法将C++0x标志添加到你的编译器,你将能够做到:

ifndef SHAPE_H
#define SHAPE_H

class Shape
{
public:

    static constexpr double pi = 3.14159265;
private:
    double originX;
    double originY;
};

#endif
Run Code Online (Sandbox Code Playgroud)

C++0x你能够使用常量表达式来比积分之外的其它类型.这使您可以声明和定义常量变量.