全局内联函数

Global Inline Functions

本文关键字:函数 全局      更新时间:2023-10-16

这里有一个单例类,称为Master。这个类有一些其他实体来完成特定的工作。Master类具有用于这些实体的get方法。

namespace Framework {
    class Master {
    private:
        NetworkController * mNetworkController;
        FileController * mFileController;
        static Master * gInstance;
    public:
        static Master * getInstance();
        NetworkController * getNetworkController();
        FileController * getFileController();
    }
}

我在整个程序中都使用这些实体,如下所示:

Framework::Master::getInstance() -> getNetworkController()
Framework::Master::getInstance() -> getFileController()

正如你所看到的,输入有点长而且耗时。所以我试着把它们放在一个宏中,比如:

#define NETWORK_CONTROLLER() Framework::Master::getInstance() -> getNetworkController()
#define FILE_CONTROLLER() Framework::Master::getInstance() -> getFileController()
namespace Framework {
    class Master {
        ...
    }
}

然而,我发现这种方法混乱而令人困惑。所以我尝试了inline方法,并将它们添加到一个头文件中。

#ifndef __FrameworkHelper__
#define __FrameworkHelper__
inline Framework::NetworkController * MasterNetworkController() { return Framework::Master::getInstance() -> getNetworkController(); }
inline Framework::FileController * MasterFileController() { return Framework::Master::getInstance() -> getFileController(); }
#endif

但当我试图在另一个类上使用它们时,它给了我编译错误:

error C2653: 'Framework' : is not a class or namespace name

我不知道为什么它会抛出这样的错误。如何使这些内联方法在整个程序中都可用?

头文件中没有namespace framework的引用,您可以通过执行以下操作来修复它:

#ifndef __FrameworkHelper__
#define __FrameworkHelper__
#include "Framework.h" // where the framework is defined
inline Framework::NetworkController * MasterNetworkController() { return Framework::Master::getInstance() -> getNetworkController(); }
inline Framework::FileController * MasterFileController() { return Framework::Master::getInstance() -> getFileController(); }
#endif

或者在你的框架标题中:

#ifndef __Framework__
#define __Framework__
namespace Framework {
    class Master {
        ...
    }
}
inline Framework::NetworkController * MasterNetworkController() { return Framework::Master::getInstance() -> getNetworkController(); }
inline Framework::FileController * MasterFileController() { return Framework::Master::getInstance() -> getFileController(); }
#endif

但我更喜欢第一种解决方案。。。。

另一个解决方案是设置getNetworkControllergetFileController static,并像一样使用它们,而不是使用inline方法

Master::getNetworkController();
Master::getFileController();

在我自己看来,这会更容易理解。

Quicker:设置getNetworkControllergetFileController方法staticgetInstance,并像这样实现它们:

NetworkController * getNetworkController() {
    return Master::getInstance()->mNetworkController;
}

您甚至可以将mFileControllermNetworkController设置为静态,因为Master是一个单例。

为了解决您提出的问题,您需要在FrameworkHelper标头中包含包含Framework命名空间定义的标头(但是要小心交叉包含)。

也许,这超出了问题范围,但我建议您完全避免使用"Framework::Master::getInstance()->…"人员。

您的客户端代码不应该知道它是单例实例还是本地临时存根(例如,出于测试目的,或者历史撤消重做快照)。因此,您唯一需要键入冗长而混乱的访问器人员的地方是模块初始化代码(所以您只需在其中放入一个引用,然后忘记"Framework::Master::getInstance()->…"。只需通过本地记住的引用来访问它。