在运行时赋值const



我有一个常量值,它在运行时永远不会改变,但在运行时之前是不可能知道的。

是否有一种方法可以在不定义常量的情况下声明常量(无论是作为类的成员还是不是),并在确定后(且仅一次)赋值计算值;或者我将不得不诉诸非const声明并使用编码S &Ps (ALL_CAPS变量名称,static声明,如果在一个类中,等),以尝试,并保持它从改变?

澄清:

虽然这些都是很好的答案,但我的现实情况要复杂得多:

程序有一个主循环,在处理和呈现之间持续运行;用户可以设置所需的选项,一旦设置,它们将永远不会改变,直到程序重新启动。为任何可以在主循环之前确定的东西设置"Initialize"函数,但是依赖于用户交互的值必须在处理阶段的循环中间执行。(现在,我想到了持久数据存储技术…)

像这样?

const int x = calcConstant();

如果它是类成员,则使用构造函数初始化列表,如Yuushi的回答。

您可以在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;
}

作为静态或函数局部变量:

const int x = calcConstant();

作为类成员:

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

是的,你可以用一个初始化方法和一个getter方法创建一个私有的静态单例字段。下面是一个示例:

// 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;
}

最新更新