我正在上课,应该可以解决C ++的一些小缺陷,例如将double
与其他double
进行比较并定义精度,等等。
我有命名空间Utilities
,其中存在class Double
:
namespace Utilities {
void init();
class Double {
public:
//! @brief Compares the equality of two doubles with defined precision
static bool fuzzyCompare(const double &d1,const double &d2);
static void setFuzzyComparePrecision(int precision);
private:
//! @brief Private constructor
Double() {};
static int fuzzyComparePrecision_;
};
}
我希望此class
仅包含static
个成员,并且不能一成不变。当前的想法是在Utilities::init()
中调用void main()
函数,以初始化class Double
成员的默认值。
是否可以在不调用fuzzyComparePrecision_
中的函数init()
的情况下设置默认值void main()
?或者换句话说,是否可以在没有fuzzyComparePrecision_
实例的情况下并且没有调用Double
之类的其他函数的情况下设置init()
的默认值?
感谢您的帮助!
答案 0 :(得分:2)
这不仅可能,而且必须(几乎)。
从C ++ 17开始,您可以将任何静态变量声明为inline
,并在类主体中对其进行初始化:
class Double {
private:
inline static int fuzzyComparePrecision_ = 0;
};
在C ++ 17之前,每个*静态类成员都需要一个类外定义。
可以(通常应该)将其与初始化结合使用,以避免处理未初始化的变量。
您必须提供以下内容(在cpp文件中):
int Utilities::Double::fuzzyComparePrecision_;
但是您也可以通过初始化来扩展它:
int Utilities::Double::fuzzyComparePrecision_ = 0;
*有例外-const
static
成员可以在类主体中使用另一个常量表达式进行初始化。
答案 1 :(得分:2)
要初始化静态成员变量,您有两种方法:
inline static
成员变量来做到这一点:
class Double {
private:
inline static int fuzzyComparePrecision_ = 2;
}
class Double {
private:
static int fuzzyComparePrecision_;
}
int Double::fuzzyComparePrecision_ = 2;