在C++中,如何在class中初始化一个不可复制的静态成员变量?
In C++, how to initialize an non-copyable static member variable in class?
我在这里模仿代码:http://www.boost.org/doc/libs/1_59_0/doc/html/program_options/tutorial.html#idp343130416。我想重写class中的代码,使用静态成员来实现功能。
但是,我发现我无法在class中初始化不可复制的静态成员变量。例如,在 class 中,以下代码不起作用:
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.
我找了很多页都没有解决。我应该怎么办?
我不想以非静态方式管理成员,因为有很多程序选项实例很奇怪。
如果您的编译器支持 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");
然而,这打破了不可复制点,因为它将使用复制构造函数。
我在这里模仿代码:http://www.boost.org/doc/libs/1_59_0/doc/html/program_options/tutorial.html#idp343130416。我想重写class中的代码,使用静态成员来实现功能。
但是,我发现我无法在class中初始化不可复制的静态成员变量。例如,在 class 中,以下代码不起作用:
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.
我找了很多页都没有解决。我应该怎么办?
我不想以非静态方式管理成员,因为有很多程序选项实例很奇怪。
如果您的编译器支持 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");
然而,这打破了不可复制点,因为它将使用复制构造函数。