具有私有构造函数的类的静态成员

时间:2019-07-25 10:28:08

标签: c++

我正在上课,应该可以解决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()的默认值?

感谢您的帮助!

2 个答案:

答案 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)

要初始化静态成员变量,您有两种方法:

  1. 如果您使用的是C ++ 17,则可以使用inline static成员变量来做到这一点:
    class Double {
    private:
        inline static int fuzzyComparePrecision_ = 2;
    }
    
  2. 对于早期版本的C ++,您必须在源文件的类声明之外进行操作(不能在头文件中):
    class Double {
    private:
        static int fuzzyComparePrecision_;
    }
    
    int Double::fuzzyComparePrecision_ = 2;