现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

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

2012-07-13 21:57 工业·编程 ⁄ 共 1266字 ⁄ 字号 暂无评论

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

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

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

class CTest
{
public:
    CTest(void);
    ~CTest(void);
    inline int GetValue();
};

在cpp文件这样实现:

#include "test.h"
CTest::CTest(void)
{
}
CTest::~CTest(void)
{
}
inline int CTest::GetValue()
{
    return 0;
}

然后在main函数这样调用:

#include "test.h"
int main( )
{
    CTest test;
    test.GetValue();
    getchar();
}

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

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

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

// test.h
#pragma once
class CTest
{
public:
    CTest(void);
    ~CTest(void);
    int GetValue()
    {
        return 0;
    }
};

或者是这样:

// test.h
#pragma once
class CTest
{
public:
    CTest(void);
    ~CTest(void);
    int GetValue();
};
inline int CTest::GetValue()
{
    return 0;
}

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

给我留言

留言无头像?