我正在创建仅限标题的库,我必须使用静态成员 是否可以在头文件中定义它而不重新定义警告?
答案 0 :(得分:9)
假设您正在谈论静态数据成员,由于静态函数成员没有问题,因此针对不同情况有各种技术:
简单积分类型const
,未采用的地址:
在类定义的声明中为它赋值。或者您可以使用enum
类型。
其他类型,逻辑上不变:
使用C ++ 11 constexpr
。
不一定是常数,或者您不能使用constexpr
:
使用模板化静态技巧或Meyers'单。
Meyers'单:
class Foo
{
private:
static
auto n_instances()
-> int&
{
static int the_value;
return the_value;
}
public:
~Foo() { --n_instances(); }
Foo() { ++n_instances(); }
Foo( Foo const& ) { ++n_instances(); }
};
模板化静态技巧的例子:
template< class Dummy >
struct Foo_statics
{
static int n_instances;
};
template< class Dummy >
int Foo_statics<Dummy>::n_instances;
class Foo
: private Foo_statics<void>
{
public:
~Foo() { --n_instances; }
Foo() { ++n_instances; }
Foo( Foo const& ) { ++n_instances; }
};
免责声明:编译器未触及任何代码。