用户定义预先声明的全局常量

时间:2013-12-10 21:51:39

标签: c++

我正处于一个我们想要全局定义的常量变量的项目中。

目前我们有一个像

这样的课程
class Settings
{
    public:
        static constexpr unsigned int CONSTANT_ONE{1};
        ...
}

问题是这些常量中的一些我们宁愿能够在程序启动时设置 (如标题所述,用户应该能够这样做)而不是在代码中预定义

有没有漂亮的方法来做到这一点,并且仍然保持变量不变?

感谢输入,干杯!

2 个答案:

答案 0 :(得分:3)

您可以将常量放在类private的{​​{1}}部分,为它们创建静态getter并编写静态函数Settings

Initialize

您还可以定义宏以自动创建getter:

class Settings
{
public:

    static bool Initialize();

    static unsigned int CONSTANT_ONE();

    ...

private:

    static unsigned int constantOne;

    ...
};

...

bool Settings::Initialize()
{
    static bool isInitialized = false;

    if (isInitialized)
    {
        // error
        return false;
    }
    else
    {
        isInitialized = true;
    }
    constantOne = 1;
    ...

    return true;
}

unsigned int Settings::CONSTANT_ONE()
{
    return constantOne;
}

...

使用示例:

#define CONSTANT_NAME(Name) my_##Name

#define DECLARE_CONSTANT(Type, Name) \
    public: \
        static Type Name(); \
    private: \
        static Type CONSTANT_NAME(Name);

#define DEFINE_CONSTANT(Type, Name) \
    Type Settings::Name() \
    { \
        return CONSTANT_NAME(Name); \
    } \
    Type Settings::CONSTANT_NAME(Name);

答案 1 :(得分:0)

我做了类似的事情但不太确定它会满足你的需要。

我在标题的类private部分声明了以下字符串:

static const char mod_name[32];

然后我在源代码中实例化它,如下所示:

const char CLASS_NAME::mod_name[32] = "SOME STRING";

也许从这开始,看看你如何传递价值?

此外,作为私有const成员,您可以在实例构造期间实例化,这样可以为您提供传递此类常量值的方法。