我注意到类中的一些函数实际上并没有访问对象,所以我将它们设为static
。然后编译器告诉我,他们访问的所有变量也必须是静态的-好吧,到目前为止还可以理解。我有一堆字符串变量,比如
string RE_ANY = "([^\\n]*)";
string RE_ANY_RELUCTANT = "([^\\n]*?)";
以此类推。然后,我将它们都设为static const
,因为它们永远不会改变。然而,我的程序只有在我把它们移出类的时候才会编译:否则,MSVC++2010会报错“只有静态常量整型变量才能在类中初始化”。
那真是太不幸了。有解决办法吗?我想把它们留在它们所属的类中。
发布于 2014-07-02 17:36:54
因为是C++11,所以可以用constexpr
在一个类中完成。
class stat {
public:
// init inside class
static constexpr double inlineStaticVar = 22;
};
现在可以使用以下命令访问该变量:
stat::inlineStaticVar
发布于 2011-02-17 01:44:50
我觉得值得补充的是,静态变量与常量变量不同。
在类中使用常量变量
struct Foo{
const int a;
Foo(int b) : a(b){}
}
我们会像这样声明它
fooA = new Foo(5);
fooB = new Foo(10);
// fooA.a = 5;
// fooB.a = 10;
对于静态变量
struct Bar{
static int a;
Foo(int b){
a = b;
}
}
Bar::a = 0; // set value for a
它的用法如下
barA = new Bar(5);
barB = new Bar(10);
// barA.a = 10;
// barB.a = 10;
// Bar::a = 10;
你看这里发生了什么。常量变量是随Foo的每个实例一起实例化的,因为Foo是实例化的,每个Foo实例都有一个单独的值,Foo根本不能更改它。
与Bar一样,无论创建多少个Bar实例,它们都只是Bar::a的一个值。它们都共享这个值,你也可以通过它们作为Bar的任何实例来访问它。静态变量还遵守public/private的规则,因此您可以使它只有Bar的实例才能读取Bar::a;
发布于 2015-02-12 02:03:37
如果您的目标是初始化头文件中的静态变量(而不是*.cpp文件,如果您坚持“仅使用头文件”的习惯用法,则可能需要该文件),则可以使用模板解决初始化问题。模板化的静态变量可以在标头中初始化,而不会导致定义多个符号。
请看这里的示例:
https://stackoverflow.com/questions/5019856
复制相似问题