2015-11-26 35 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; 
}();