[英]How to define compile-time (static) constant inside a C++ class?
我有一些常量只需要在編譯時使用來簡化代碼,所以我不需要在運行時可用的實際變量。
傳統上這樣做的方式是#define NAME 123
但我想要一個類型安全的替代品。
在類之外你可以使用const int name = 123;
哪個工作正常,但似乎不可能把它放在一個類。 例如:
class Example {
public:
const double usPerSec = 1000000.0;
};
double usOneMinute = 60 * Tempo::usPerSec;
使用Visual C ++,但不適用於GCC:
error: non-static const member ‘const double Example::usPerSec’,
can’t use default assignment operator
您可以通過使其靜態來修復它,但隨后Visual C ++抱怨:
error C2864: 'Example::usPerSec' : a static data member with an in-class
initializer must have non-volatile const integral type
type is 'const double'
我猜這意味着VC ++只接受static const int
。
我想避免在構造函數中設置值,因為我在運行時需要一個類的實例來訪問該值,而實際上我希望它在編譯時都像#define
一樣處理。
那么如何將一個常量定義為一個類中的double
,而不是使其成為全局或使用#define
,這將在沒有該類的實例的情況下工作,並且它將與主要的C ++ 03編譯器一起工作?
積分和其他類型之間存在差異。 對於整數類型,您始終可以將它們定義為const static
成員,如
struct Example
{
const static int name = 123; // added 'static' to code in text of question
const static unsigned usPerSec = 1000000;
};
對於非整數類型,例如示例中的double
,情況更復雜。 自2011年以來(使用編譯器選項std=c++11
與大多數編譯器),您可以簡單地執行此操作:
struct Example
{
constexpr static double usPerSec = 1000000.0;
};
但是用gcc,這個
struct Example
{
const static double usPerSec = 1000000.0;
};
應該也適用於C ++ 03(它是一個GNU擴展)。
但是,C ++ 03中的標准方法(也是標准庫本身(例如std::numeric_limits<>
))使用的是static
成員函數
struct Example
{
static double usPerSec() { return 1000000.0; }
};
我看到C ++ 03有兩種可能的方法:
使用靜態成員函數並依賴於內聯:
class Example { public: static double usPerSec() { return 1000000.0; } }; double usOneMinute = 60 * Example::usPerSec();
使用靜態數據成員並在常量折疊時退出(使用常量的值將在運行時計算):
class Example { public: static const double usPerSec; }; double usOneMinute = 60 * Example::usPerSec; // Somewhere in one .cpp const double Example::usPerSec = 1000000.0;
如果我是你,我會把它放在命名空間中:
namespace MyExampleNamespace {
const double usPerSec = 1000000.0;
}
double usOneMinute = 60 * MyExampleNamespace::usPerSec;
此代碼適用於vc ++和gcc:
class Example {
public:
static const double usPerSec ;
};
const double Example::usPerSec=10000.0;
double usOneMinute = 60 * Example::usPerSec;
你必須使它成為靜態const,然后在課外給它值。 不要在構造函數內部執行此操作。 您不必創建make實例
class Example {
public:
static const double usPerSec;
};
double Example::usPerSec = 1000000.0;
現在您可以在任何地方使用它而無需創建任何類實例
double someVar = Example::usPerSec;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.