簡體   English   中英

具有私有構造函數的類的靜態成員

[英]Static member of class with private constructor

我正在上課,應該可以解決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成員,不instanciable。 當前的想法是在void main()調用Utilities::init()函數,該方法將初始化class Double成員的默認值。

是否可以設置默認的fuzzyComparePrecision_而不在void main()調用函數init() void main() 或者換句話說,是否可以在沒有Double實例且沒有調用其他函數(如init()情況下設置fuzzyComparePrecision_默認值?

謝謝你的幫助!

這不僅是可能的,而且(幾乎)需要這樣做。

從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. 如果您使用的是C ++ 17,則可以使用inline static成員變量來執行此操作:
     class Double { private: inline static int fuzzyComparePrecision_ = 2; } 
  2. 對於早期版本的C ++,您必須在源文件的類聲明之外進行操作(不能在頭文件中):
     class Double { private: static int fuzzyComparePrecision_; } 
     int Double::fuzzyComparePrecision_ = 2; 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM