Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不使用定义的较短调用/名称_C++_Visual Studio 2008 - Fatal编程技术网

C++ 不使用定义的较短调用/名称

C++ 不使用定义的较短调用/名称,c++,visual-studio-2008,C++,Visual Studio 2008,简单的问题是,如何在不使用defines的情况下缩短通话/姓名 例如,我有一个必须在命名空间内调用的单例(我不能使用使用命名空间blabla,因为这是不允许的),如下所示: 现在我可以把它分配给一个变量,如果我在同一个类/函数中多次使用它,这个变量会起作用,但是在许多类/函数中使用它会变得很麻烦。我决定使用#定义: #define MyFW::GameRoot::Instance() ROOT //defined in GameRoot.h ROOT->DoSomething(); //

简单的问题是,如何在不使用defines的情况下缩短通话/姓名

例如,我有一个必须在命名空间内调用的单例(我不能使用使用命名空间blabla,因为这是不允许的),如下所示:

现在我可以把它分配给一个变量,如果我在同一个类/函数中多次使用它,这个变量会起作用,但是在许多类/函数中使用它会变得很麻烦。我决定使用#定义:

#define MyFW::GameRoot::Instance() ROOT //defined in GameRoot.h

ROOT->DoSomething(); //Used where-ever GameRoot.h is included
更好,我真的很喜欢它,特别是因为现在无论我在哪里看到根(通过V-Assist进行颜色编码),我都能立即知道它是什么。。。除非我在那里有一个断点,并且我需要VisualStudio解析ROOT以显示在“监视”窗口中(或者甚至将鼠标悬停在它上面以在调试中快速调出对象),否则它无法做到这一点

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

谢谢

使用本地引用:

MyFW::GameRoot& ROOT = *MyFW::GameRoot::Instance();
不要使用defines。

这样做的好方法是

这是一个using声明,与前面提到的using指令不同。

您不能使用using namespace…,但可以使用吗

namespace root=MyFW::GameRoot;
然后你就可以打字了

root::Instance()->DoSomething();

这样定义名称空间比#define更好。(也就是说,它不能被错误地复制到其他地方。编译器知道您要做什么。)

如果您想轻松访问多个函数,只需使用一个helper函数:

namespace {
    MyFW::GameRoot* root() { return MyFW::GameRoot::Instance(); }
}

// ...
root()->DoSomething();


两个字符,但它包含了类型安全性。

+ 1,这是一个使用较少的C++特征,这里也提到:当我们在拾取模式中时,现在有多好:<代码>根::根::实例()::g();根::实例()::h().namespace MyFW{class GameRoot{…};至少我的编译器告诉我“foo.cc:36:error:`GameRoot'不是名称空间名称”@Georg我同意在这种情况下它至少要短一些(虽然您可以使用
名称空间r=…
。我从这项技术中得到了很多好处,因为我使用的代码通常嵌套在名称空间的3个级别中,并带有长名称。我意识到我在很长一段时间后才在这里回复,但我只是在遇到的另一个“问题”区域尝试了这个方法,并记住了您的解决方案。
名称空间newAlias=SomeNameSpace::ClassName;
不起作用,因为命名空间别名只能用于现有命名空间,而不能用于符号。因此,在这个问题中,我只能为
MyFW
提供别名,该别名已经足够短,不需要别名。如果上述错误,请更正/澄清。谢谢在运行时不必要地增加了函数调用成本。@cape:不,除非您使用的是老式编译器,否则不会。定义是可见的,任何符合其粒度的编译器都会产生相同的结果。在向下投票之前,请先检查您的事实。注意这一点。另一个反对意见是,它隐藏了实例()的使用当你调试的时候,你会说,“嘿,根又是什么,它从哪里来的?”@cape:这就是源代码的用途“跳转到定义”或者不管IDE如何称呼它。每当你做一些更简洁的东西时,你都会在某种程度上隐藏信息,因此…我可以基于同样的理由反对你的答案-名称空间从何而来?@sergej:编译器可以自由忽略
内联
,也可以自由内联未标记的函数。今天的编译器将内联不管是哪种方式,特别是在这样简单的情况下。这不必要地添加了一个新变量来解决语法问题。如果您想知道:出于某种原因,所以决定在错误点击后立即锁定我的投票,从而进行一次小的编辑。@cape1232,引用实际上不是一个变量。它只是实际对象的别名。您不能ssign new value to the reference,并在结果机器代码中使用它不会产生任何成本。MyFW::GameRoot不是一个类吗?您可以拥有一个类的引用,以便以后调用它的静态成员吗?看起来像
MyFW::GameRoot::Instance()
返回指向
MyFW::GameRoot
的指针。您可以取消引用该指针,然后初始化引用。此语法假定GameRoot是一个类。忘记我说过的任何话,那一定是一些轻微的大脑故障:)
root::Instance()->DoSomething();
namespace {
    MyFW::GameRoot* root() { return MyFW::GameRoot::Instance(); }
}

// ...
root()->DoSomething();