简单的问题,如何在不使用定义的情况下缩短呼叫/名称。
例如,我有一个我必须在命名空间内调用的单例(我不能使用使用命名空间blabla ,因为它是不允许的),如下所示:
MyFW::GameRoot::Instance()->DoSomething();
现在我可以将它分配给一个变量,如果我在同一个类/函数中多次使用它,它会有所作为,但在许多类/函数中使用它会变得很麻烦。我决定使用#define:
#define MyFW::GameRoot::Instance() ROOT //defined in GameRoot.h
ROOT->DoSomething(); //Used where-ever GameRoot.h is included
好多了,我真的很喜欢它,特别是因为现在无论我在哪里看到ROOT(通过V-Assist进行颜色编码)我都知道它是什么...除非我有一个断点,我需要Visual Studio来解决根到显示在监视窗口中(或者甚至将鼠标悬停在它上面,以便在调试中快速拉出对象),这是它无法做到的。
还有其他选择吗?你们做些什么来缩短名字?只需使用本地/成员指针来存储实例?
谢谢!
答案 0 :(得分:5)
使用本地参考:
MyFW::GameRoot& ROOT = *MyFW::GameRoot::Instance();
不要使用定义。
答案 1 :(得分:5)
您不能使用使用命名空间... ,但可以使用
namespace root=MyFW::GameRoot;
然后你可以输入
root::Instance()->DoSomething();
定义这样的命名空间比#define更好。 (即它不会被错误地传播到其他地方。编译器知道你要做什么。)
答案 2 :(得分:2)
如果您希望简化多个功能的访问,只需使用辅助功能:
namespace {
MyFW::GameRoot* root() { return MyFW::GameRoot::Instance(); }
}
// ...
root()->DoSomething();
更多两个字符,但包括类型安全。
答案 3 :(得分:1)
执行此操作的好方法(但标题中从不)是
using MyFW::GameRoot;
GameRoot::Instance()->DoSomething;
这是使用声明,与 using directive 不同,这就是你在上面提到的。