在C ++中,如何在类中初始化不可复制的静态成员变量?

时间:2015-08-31 10:00:28

标签: c++ static initialization

我在这里模仿代码:http://www.boost.org/doc/libs/1_59_0/doc/html/program_options/tutorial.html#idp343130416。我想在类中重写代码,使用静态成员来实现功能。

但是,我发现我无法在类中初始化不可复制的静态成员变量。例如,在类中,以下代码不起作用:

class ProgramOptions{
private:
static po::options_description config("Generic options");
}
// Possible reason: visual studio treat it as function declaration.

class ProgramOptions{
private:
static po::options_description config = po::options_description config("Generic options");
}
// Possible reason: in C++, only the int type can be done this way. 
// For other types, static variable can't be evaluated where it's declared.

class ProgramOptions{
private:
static po::options_description config;
static void InitializeSaticMemberVariables()
    {
        generic = po::options_description("Generic options");
    }
}
// warning C4512: assignment operator cannot be generated.
// Possible reason: options_description is not copyable and the operator = has been intentionally disabled.

我搜索了许多页面仍未能解决它。我该怎么办?

我不想以非静态方式管理成员,因为有很多程序选项实例很奇怪。

1 个答案:

答案 0 :(得分:1)

如果您的编译器支持C ++ 11和大括号初始化,则第一个替代方案应该有效:

static po::options_description config{"Generic options"};

请注意,您仍然需要实际定义变量。

可能会使用第二个变体,但是您在定义中初始化变量:

class ProgramOptions{
private:
    static po::options_description config;
    ...
};

...

po::options_description ProgramOptions::config = po::options_description config("Generic options");

然而,这会破坏不可复制的点,因为它将使用复制构造函数。