Why are classes with static data members getting linker errors?

本文解释了C++中静态数据成员必须在某个编译单元中明确定义的原因,并提供了如何避免链接错误的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.parashift.com/c++-faq-lite/link-errs-static-data-mems.html


Because static data members must be explicitly defined in exactly one compilation unit. If you didn't do this, you'll probably get an "undefined external" linker error. For example:

// Fred.h

class Fred {
public:
  ...
private:
  static int j_;   // Declares static data member Fred::j_
  ...
};
The linker will holler at you ( "Fred::j_ is not defined") unless you define (as opposed to merely declare)  Fred::j_ in (exactly) one of your source files:
// Fred.cpp

#include "Fred.h"

int Fred::j_ = some_expression_evaluating_to_an_int;

// Alternatively, if you wish to use the implicit 0 value for static ints:
// int Fred::j_;
The usual place to define  static data members of  class  Fred is file  Fred.cpp (or  Fred.C or whatever source file extension you use).

Note: in some cases, you can add = initializer; to the declaration of class-scope static declarations, however if you ever use the data member, you still need to explicitly define it in exactly one compilation unit. In this case you don't include an = initializer in the definition. A separate FAQ covers this topic.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值