这是使用静态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>.
如果你有办法将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你能够使用常量表达式来比积分之外的其它类型.这使您可以声明和定义常量变量.