全局内联函数

时间:2013-07-15 09:58:21

标签: c++

我这里有一个名为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

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

3 个答案:

答案 0 :(得分:3)

您的标头文件中没有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

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

另一种解决方案是设置inlinegetNetworkController getFileController而不是使用static方法,而是使用它们:

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

我个人认为这会更容易理解。

答案 1 :(得分:0)

更快:设置getNetworkControllergetFileController方法static以及getInstance,并按照以下方式实施:

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

您甚至可以设置mFileControllermNetworkController静态,因为Master是单身。

要解决您的问题,您需要在FrameworkHelper标头中包含包含Framework命名空间定义的标头(但要注意交叉包含)。

答案 2 :(得分:0)

也许,这不是问题的范围,但我建议你尽量避免使用“Framework :: Master :: getInstance() - > ...”工作人员。

您的客户端代码应该不知道它是单例实例还是本地临时存根(例如用于测试目的,或者历史记录undo-redo快照)。因此,你必须输入那个冗长的访问器工作人员的唯一地方是模块初始化代码(所以你只需要引用它然后忘记“Framework :: Master :: getInstance() - > ...”。通过本地记忆参考来访问它。