2013-01-03 31 views
6

我有一個恆定的值,在運行時永遠不會改變,但直到運行時纔可能知道。C++在運行時分配一個const值?

有沒有一種方法來聲明一個常量(或者作爲一個類的成員或沒有),而沒有定義它,並且也確定一次計算值(並且只有一次);或者我將不得不求助於非常量聲明並使用編碼S & Ps(ALL_CAPS變量名稱,static聲明,如果在一個類中,等等)到嘗試並保持它不變?

澄清:

雖然這些都是很好的答案,真實世界的情況我是比較複雜:

該方案有不斷處理和渲染之間運行的主循環;用戶可以設置所需的選項,一旦它們被設置,它們將永遠不會改變,直到程序重新啓動。對於可在主循環之前確定的任何內容設置「初始化」函數,但在處理階段期間必須在循環的中間執行取決於用戶交互的值。 (目前,持續數據存儲技術浮現在腦海中......)

+1

關於澄清。這聽起來像你有一個循環,並希望某些變量(s)在某個時間點「變爲」const。這是不可行的;一個變量是const,或者它不是。 –

回答

7

這樣的事情?

const int x = calcConstant(); 

如果它是一個類的成員,然後用構造函數初始化列表,如Yuushi的答案。

6

您可以在structclass定義,並利用一個初始化列表:

#include <iostream> 

struct has_const_member 
{ 
    const int x; 

    has_const_member(int x_) 
     : x(x_) 
    { } 

}; 

int main() 
{ 
    int foo = 0; 
    std::cin >> foo; 
    has_const_member h(foo); 
    std::cout << h.x << "\n"; 
    return 0; 
} 
4

爲靜態或函數局部變量:

const int x = calcConstant(); 

作爲一類成員:

struct ConstContainer { 
    ConstContainer(int x) : x(x) {} 
    const int x; 
}; 
1

是的,你可以創建一個私有靜態單身字段與initiali zation方法和gettor方法。下面是如何做到這一點的例子:

// In foo.h 
class Foo 
{ 
public: 
    // Caller must ensure that initializeGlobalValue 
    // was already called. 
    static int getGlobalValue() { 
     if (!initialized) { 
      ... handle the error ... 
     } 
     return global_value; 
    } 

    static void initializeGlobalValue(...) 

private: 
    static bool initialized; 
    static int global_value; 
}; 

// In foo.cpp 
bool Foo::initialized = false; 
int Foo::global_value; 

void Foo::initializeGlobalValue(...) { 
    if (initialized) { 
     ...handle the error... 
    } 
    global_value = ...; 
    initialized = true; 
} 
0

我回答這個問題的方法是計數字符串中的每個字符的數量,並返回false後,某些字符數超出字符限制,這將be(str.size()+ 1)/ 2。如果沒有字符數超過此限制,則返回true。

bool canShuffle(string str) { 
    int maxCharCount = (str.size()+1)/2; 
    int charCount[256] = {0}; 

    for(char c : str) { 
     if(++charCount[c] >= maxCharCount) 
      return false; 
    } 
    return true; 
} 
+3

我想你回答了一個你並不認爲你在回答的問題。錯誤的窗口綜合徵也許? – Casey