2015-11-26 70 views
2

這是一個非常基本的問題;對不起,如果它很常見,但我找不到具體的答案。處理需要多行初始化的'const'對象

通常情況下,我發現自己處於一個對象固有不變的情況,但需要多行來初始化。例如說我想要一個箭步是一個未知在編譯時數在向量元素的產品:

const std::vector<int> extentsVector; //pretend this is initialized 
int stride = 1; 
for (int i=0; i<k; ++i){ 
    stride *= extentsVector[i]; 
} 

無論如何,你的想法。我再也不想碰「大步」,所以它應該是const。處理這個問題的首選方法是什麼?我是否使用臨時計算值並將其分配給'const'對象?或者是一個更好的演員?或者我只是把它保留爲非const?

+0

C不是C++不C!不要添加不相關的標籤。 – Olaf

+1

@Olaf除了示例中的「std :: vector」(這不是實際問題的根本),我覺得這個問題的基本思想同樣適用於兩種語言,但是沒問題。 – AGML

+0

根據語言,合適的解決方案可能會有很大的不同。只是不要將C標籤用於C++,反之亦然。 – Olaf

回答

6

使用的初始化函數:

int ComputeStride() { 
    int s = 1; 
    for (auto e: extentsvector) 
     s *= e; 
    return s; 
} 
const int stride = ComputeStride(); 
+0

如何調用可能位於只讀存儲器中的'const'對象? – Olaf

+0

@Olaf我不認爲編譯器會將複雜的數據結構放在只讀存儲器中,主要是因爲它可能無法在編譯時初始化它們。 – immibis

+0

@immibis:一如既往,對此沒有簡單的答案。 Bascially:這取決於。如果所有元素都是'const',那麼應該沒有什麼問題(是的,這也可能被簡化了)。否則例如嵌入式系統在使用RAM時可能會遇到大量麻煩。 – Olaf

3

在C要做到這一點常用方式++ 11是使用lambda函數並初始化const的變量:

const std::vector<int> extentsVector; 
const int stride = [&extentsVector]() -> int 
{ 
    int stride = 1; 
    for (int i = 0; i < k; ++i) 
    { 
     stride *= extentsVector[i]; 
    } 
    return stride; 
}();