不使用定义的较短的呼叫/名称

时间:2010-07-16 04:51:55

标签: c++ visual-studio-2008

简单的问题,如何在不使用定义的情况下缩短呼叫/名称。

例如,我有一个我必须在命名空间内调用的单例(我不能使用使用命名空间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来解决根到显示在监视窗口中(或者甚至将鼠标悬停在它上面,以便在调试中快速拉出对象),这是它无法做到的。

还有其他选择吗?你们做些什么来缩短名字?只需使用本地/成员指针来存储实例?

谢谢!

4 个答案:

答案 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 不同,这就是你在上面提到的。