全局内联函数
Global Inline Functions
这里有一个单例类,称为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
但我更喜欢第一种解决方案。。。。
另一个解决方案是设置getNetworkController
和getFileController
static
,并像一样使用它们,而不是使用inline
方法
Master::getNetworkController();
Master::getFileController();
在我自己看来,这会更容易理解。
Quicker:设置getNetworkController
和getFileController
方法static
和getInstance
,并像这样实现它们:
NetworkController * getNetworkController() {
return Master::getInstance()->mNetworkController;
}
您甚至可以将mFileController
和mNetworkController
设置为静态,因为Master
是一个单例。
为了解决您提出的问题,您需要在FrameworkHelper标头中包含包含Framework
命名空间定义的标头(但是要小心交叉包含)。
也许,这超出了问题范围,但我建议您完全避免使用"Framework::Master::getInstance()->…"人员。
您的客户端代码不应该知道它是单例实例还是本地临时存根(例如,出于测试目的,或者历史撤消重做快照)。因此,您唯一需要键入冗长而混乱的访问器人员的地方是模块初始化代码(所以您只需在其中放入一个引用,然后忘记"Framework::Master::getInstance()->…"。只需通过本地记住的引用来访问它。
- 内联函数中具有内部链接的全局变量
- 为什么虚函数不能是静态的和全局的?
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 全局作用域中函数指针的赋值
- 在命名空间中使用全局命名空间中的函数
- C++ 在编译时具有函数计算全局变量
- 在具有全局类型def的类中使用成员函数指针
- 修改程序的入口点时未调用全局变量的构造函数
- 从函数中全局删除并重新实例化数组结构,而无需在编译时知道数组的大小
- 尝试更改 main 函数内的全局变量值时出现编译错误 C++.
- 赋予全局变量而不是局部变量优先级的函数 - (异常行为)
- 全局函数参数
- std::线程不是全局变量,但在到达创建它的函数的末尾时不会超出范围?
- 初始化与函数输入相关的全局数组
- 删除全局隐式函数 - 避免使用不明确的运算符
- 如何在全局变量的构造函数之前运行函数
- 如何定义全局函数指针并分配给特定地址
- 越界成员函数定义是否需要一个完全限定的类名,直到全局范围
- 在函数中用不同的名称引用全局向量
- 如何在一个结构体中为多个函数全局存储数据