如何使用内联函数说明符“隐藏”私有成员函数?

时间:2015-07-20 18:34:13

标签: c++

有一个包含private成员函数的类,我想标记为inline(明确标记我暗示特定函数可能被内联的意图),但不要暴露他们的实现API消费者。为简单起见,它可能看起来像:

Airplane.h

class Airplane
{
    char manufacturer[80];
    char mode[80];
    // ... 
public:
    void autopilot_steer_left(int degree);
    // ...
private:
    // ...
    inline bool validate_hydraulic_on_left_wing();  // secret, patent-based, etc.
};

Airplane.cpp

#include "Airplane.h"
// ...

void Airplane::autopilot_steer_left(int degree)
{
    // ...
}

我应该在哪里定义Airplane::validate_hydraulic_on_left_wing?我知道常见的地方是Airplane.h(可能在课堂内,所以它是inline隐含的),但这与我的意图相矛盾。

3 个答案:

答案 0 :(得分:4)

您可以在.cpp文件中使用关键字inline

inline void Airplane::autopilot_steer_left(int degree)
{
    // ...
}

因此,您的实现将隐藏在.cpp文件和inline中。

然而,关于这样做的好处,这是值得商榷的。以下是有关inline效果的良好讨论: Benefits of inline functions in C++?

答案 1 :(得分:4)

如果无法从单个翻译单元(即cpp文件)的外部调用该函数,那么将其标记为内联通常没有任何意义。

从C ++的角度来看,内联修饰符仅允许以多个单位定义函数。内联关键字背后不再有语义。

从函数调用的实际内联(即编译器优化)的角度来看,只有将编译器配置为永不内联未标记为内联的函数(如Visual C ++的/Ob1)时,它才有用。但是,现代编译器尝试内联所有函数是很正常的。在这种情况下,编译器甚至不会查看您是否将函数标记为内联函数:如果编译器认为它使代码更好,则单个单元内的任何调用都将被内联。

答案 2 :(得分:3)

这没有任何意义。内联函数的整个要点是确保调用点上的定义可用于直接替换调用。这与您想要做的事情完全相反:隐藏远离呼叫站点的定义。

无论如何,这并不重要,因为inline完全被忽略用于内联目的,并且仅用于规定一些宽松的链接要求。但是,实际上,无论是否在其上写inline,您的函数都不会被内联。

只需删除inline关键字,然后像现在一样在外部定义该功能。

然后打开链接时优化,并希望您的编译器决定在链接时内联函数定义。这是最新的,你可以得到内联功能,希望足够"隐藏"为了你的愿望。

如果没有,那么真的重要吗?