类的内联函数的实现应该放在哪里

作者:朱金灿
来源:http://blog.csdn.net/clever101/


      今天公司研发部举行会议,讨论执行代码审查事宜。在讨论到一条:头文件不能放函数实现代码,我提出异议:内联函数应该例外。同事反驳说:内联函数的实现也可放进cpp文件。我摆出我的理由:如果是类的内部使用该类的内联函数,函数实现放哪都行(头文件和cpp文件都可以);但是如果外部调用类的内联函数同时该函数的实现又是放在cpp中,那会出现错误。同事于是问我会出现什么错误,当时我也没答上来。于是大家就先略过再去讨论其它方面。


       我记得当年我还在CSDN上发过一个讨论的帖子,于是到网上搜索了一下,链接如下:


C++中的inline函数的实现部分应该放在哪里呢?


      晚上回去写代码测试一下,如果把内联函数的实现放在cpp文件而外部又调用这个函数的话,确实会出现这个函数无法识别的错误。测试办法如下:


新建一个CTest类,在头文件这样声明:



在cpp文件这样实现:



然后在main函数这样调用:




不出意外的话应该会出现下面的链接错误:

1>TestSort.obj : error LNK2019: unresolved external symbol "public: int __thiscall CTest::GetValue(void)" (?GetValue@CTest@@QAEHXZ) referenced in function _main
1> F:/MyTest/MyTest/src/Debug/TestSort.exe : fatal error LNK1120: 1 unresolved externals


    我的编译环境是:VS 2008 + sp1,Win XP + sp3。

要解决这个错误,需要把CTest类的GetValue函数放回CTest类的头文件。如下:




  或者是这样:




      《高质量C++编程》的作者林锐博士推荐后一种做法,认为后者是一种良好的编程风格。后来查了查《C++ Primer》(第三版,Stanley B Lippman Josee Lajoie 著,潘爱民 张丽译),里面给出的理论依据是:由于内联函数必须在调用它的每个文本文件中被定义,所以没有在类体中定义的内联成员函数必须被放在类定义出现的头文件中。



参考文献:


1. 《C++ Primer》(第三版,Stanley B Lippman Josee Lajoie 著,潘爱民 张丽译)。


2. 《高质量C++编程》,林锐著。





  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

clever101

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值