0

我在这里有一个单例类,称为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

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

4

3 回答 3

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

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

另一种解决方案,而不是使用您的inline方法,是设置getNetworkControllerandgetFileController static并使用它们:

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

在我个人看来,它会更容易理解。

于 2013-07-15T10:08:06.650 回答
0

更快:设置你的getNetworkControllergetFileController方法staticgetInstance并像这样实现它们:

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

你甚至可以设置你的mFileControllermNetworkController静态的,就像Master单例一样。

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

于 2013-07-15T10:08:03.057 回答
0

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

您的客户端代码应该不知道它是单例实例还是本地临时存根(例如,用于测试目的或历史撤消重做快照)。因此,您唯一需要输入冗长杂乱的访问人员的地方是模块初始化代码(因此您只需将引用放入其中,然后忘记“Framework::Master::getInstance()->...”。只需访问它通过本地记住的参考。

于 2013-07-15T10:42:11.720 回答