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

转载 2016年06月02日 10:09:24

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


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


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


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


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


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


[cpp] view plain copy
  1. class CTest  
  2. {  
  3. public:  
  4.     CTest(void);  
  5.     ~CTest(void);  
  6.     inline int GetValue();  
  7. };  


在cpp文件这样实现:


[cpp] view plain copy
  1. #include "test.h"  
  2. CTest::CTest(void)  
  3. {  
  4. }  
  5. CTest::~CTest(void)  
  6. {  
  7. }  
  8. inline int CTest::GetValue()  
  9. {  
  10.     return 0;  
  11. }  


然后在main函数这样调用:


[cpp] view plain copy
  1. #include "test.h"  
  2. int main( )  
  3. {  
  4.     CTest test;  
  5.     test.GetValue();  
  6.     getchar();  
  7. }  



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

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类的头文件。如下:



[cpp] view plain copy
  1. // test.h  
  2. #pragma once  
  3. class CTest  
  4. {  
  5. public:  
  6.     CTest(void);  
  7.     ~CTest(void);  
  8.     int GetValue()  
  9.     {  
  10.         return 0;  
  11.     }  
  12. };  


  或者是这样:


[cpp] view plain copy
  1. // test.h  
  2. #pragma once  
  3. class CTest  
  4. {  
  5. public:  
  6.     CTest(void);  
  7.     ~CTest(void);  
  8.     int GetValue();  
  9. };  
  10. inline int CTest::GetValue()  
  11. {  
  12.     return 0;  
  13. }  



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



参考文献:


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


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


相关文章推荐

内联函数体要放在头文件

  • 2012年09月28日 11:24
  • 1KB
  • 下载

内联函数&类的成员函数

  • 2011年07月29日 13:25
  • 1KB
  • 下载

堆(stack) 之 c 和 c++模板实现(空类默认成员函数 初谈引用 内联函数)

/* 学习心得: 1、 此栈用链表实现,与上面的用数组实现不一样;用到了模板类Stack 2、 此类用到了复制构造函数 Stack(const Stack &original)...

内联函数笔记

  • 2014年08月17日 16:16
  • 18KB
  • 下载

DSP 内联函数(inline)在x86上实现的一些要点之后的验证方法(一)感悟

时隔多年,重回研发。 这次是开发物理层的DMRS,PRACH和SRS三个序列。 时过境迁,让我没有想到的是,DSP的程序,目前要在x86和FPGA上实现。 这里,在开始之前,想说些闲话:...

4.28笔记--关于内联函数和接口实现

1、合理运用inline函数 虽然说内联函数在理论上是可以提高程序的,但是要合理运用内联函数。对于一个代码量较小的函数进行的内联当然比较好,但是如果代码量过大,可能会造成代码膨胀引起系统颠簸(不合理...

类和对象、内联函数、重载

1.C++类和对象类与结构体一样,有相似之处,从今天开始学习。加油。1.1类的声明与对象的创建声明class Student{ public: char *name; ...
  • JSRGFJZ
  • JSRGFJZ
  • 2016年03月10日 09:00
  • 245

内联函数-14.08.25

  • 2016年06月14日 21:11
  • 185KB
  • 下载

内联函数及三种重载

  • 2014年07月05日 17:01
  • 512B
  • 下载

Cpp Primer<<学习函数-局部对象、内联函数、类的成员函数_1

函数 1.局部对象 2.内联函数 3.类的成员函数
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:类的内联函数的实现应该放在哪里
举报原因:
原因补充:

(最多只允许输入30个字)