【发布时间】:2023-03-31 22:57:02
【问题描述】:
我正在创建仅标头库,我必须使用静态成员。
是否可以在头文件中定义而不出现重定义警告?
【问题讨论】:
-
显式
inline可能有助于定义。
标签: c++
我正在创建仅标头库,我必须使用静态成员。
是否可以在头文件中定义而不出现重定义警告?
【问题讨论】:
inline 可能有助于定义。
标签: c++
假设你说的是静态data成员,既然静态函数成员没问题,那么针对不同情况有多种技术:
简单整型,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; }
};
免责声明:编译器不会触及任何代码。
【讨论】: