我这里有一个名为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
我不知道为什么它会抛出这样的错误。如何在整个程序中使这些内联方法可用?
答案 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
但我更喜欢第一种解决方案......
另一种解决方案是设置inline
和getNetworkController
getFileController
而不是使用static
方法,而是使用它们:
Master::getNetworkController();
Master::getFileController();
我个人认为这会更容易理解。
答案 1 :(得分:0)
更快:设置getNetworkController
和getFileController
方法static
以及getInstance
,并按照以下方式实施:
NetworkController * getNetworkController() {
return Master::getInstance()->mNetworkController;
}
您甚至可以设置mFileController
和mNetworkController
静态,因为Master
是单身。
要解决您的问题,您需要在FrameworkHelper标头中包含包含Framework
命名空间定义的标头(但要注意交叉包含)。
答案 2 :(得分:0)
也许,这不是问题的范围,但我建议你尽量避免使用“Framework :: Master :: getInstance() - > ...”工作人员。
您的客户端代码应该不知道它是单例实例还是本地临时存根(例如用于测试目的,或者历史记录undo-redo快照)。因此,你必须输入那个冗长的访问器工作人员的唯一地方是模块初始化代码(所以你只需要引用它然后忘记“Framework :: Master :: getInstance() - > ...”。通过本地记忆参考来访问它。