C++ 使用命名空间来避免长路径

2024-05-05

我仍在学习 C++,之前从未真正创建过自己的命名空间。我正在对它们进行试验,虽然我已经完成了大部分工作,但有一件事我似乎仍然无法做到。我希望能够在类中调用静态方法,而无需输入类似的内容NameOfClass::method。我认为代码应该如下所示,但无法编译:

File A.h,

namespace Test
{
    class A
    {
        public:
            static int foo() { return 42; }
    };
}

File main.cpp,

#include <iostream>

#include "A.h"

using namespace std;
using namespace Test::A;

int main()
{
    cout << foo() << endl;

    return 0;
}

编译器给了我:

main.cpp:6: error: ‘A’ is not a namespace-name
main.cpp:6: error: expected namespace-name before ‘;’ token
main.cpp: In function ‘int main()’:
main.cpp:10: error: ‘foo’ was not declared in this scope

是否可以在不打字的情况下完成我想做的事情A::foo?


在 C++ 中,您/尤其是/必须仔细阅读编译器错误消息。

请注意,第一个错误是“错误:‘A’不是命名空间名称”。确实如此,A 是一个类名。

using namespace Foo; // brings in  all of foo;
using Bar::Baz // brings in only Baz from Bar

你想写:

using Test::A;

这有两个好处:它引入了 A 供你使用,并且它没有引入 Test 的所有其余部分,这也很好,因为你应该只引入你需要的内容,以免意外依赖你没有意识到你所依赖的东西。

但是,由于 foo 在 A 中是静态的,因此您仍然必须显式引用 A::foo 。 (除非你做了一些事情,比如编写一个转发到 A::foo 的自由函数;一般来说,如果你只是为了节省一些打字,那么这是一个坏主意。)

有些人可能建议根本不使用 using 声明,而是完全限定所有名称。

但这是(引用 Stroustrup 的话)“乏味且容易出错”,并且它妨碍了重构:假设您完全限定了 FooMatic::Stack 类的每次使用,然后管理层坚持要求,就在您准备这样做之前去生产,你使用 BarMatic 非常相似的 Stack 类,因为 barMatic 刚刚买下了你的公司。

如果您在所有地方都完全合格,您将进行大量的 grep 操作,希望您的正则表达式是正确的。如果您使用了 using 声明,则只需修复您的(希望是共享的)头文件即可。这样,using 声明很像“typedef int ourInt;”或一个明显的常量或 const:“const int FOO = 1;”,因为它提供了一个位置来更改引用到多个位置的内容。在每次使用时完全限定命名空间会消除这一好处。

相反,如果您使用 using 指令并引入所有命名空间 FooMatic,那么您的 grep 可能会更加困难,如果说管理层坚持使用 BarMatic::Foo 但您仍然必须使用 FooMatic:Baz,BarMatic 相当于 Baz 的无论什么原因都无法使用。

因此,一次引入一种类型(类、函数、常量)通常是最灵活的,这是最好的保护自己免受不可避免但未知的变化的方法。与大多数编码一样,您希望最大限度地减少繁琐的重复,同时保持足够的粒度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 使用命名空间来避免长路径 的相关文章

  • 如果异常保存在 std::exception_ptr 中,那么在 catch 语句之外使用异常是否安全?

    我有一个std exception ptr其中有一个例外 我要调用std rethrow exception要获取实际的异常 catch 语句之后的异常是否有效 我的猜测是 因为我仍然持有std exception ptr它仍然有效 参见示
  • C++,多语言/本地化支持

    向 C 程序添加多语言支持的最佳方法是什么 如果可能 应该从包含键值对 WelcomeMessage Hello s 之类的纯文本文件中读取语言 我想到了添加一个 localizedString key 函数来返回加载的语言文件的字符串 有
  • 从数组中输入多个数字,每个数字检查是否为整数

    每个人 我希望有人能帮我弄清楚C语言的一些东西 这是我第一次认真地做IT方面的作业 我没有经验 而且我正在电子学习中学习 所以老师的帮助不是很好 我需要用C语言开发控制台应用程序 用户需要输入10个整数 如果插入的数字不是整数 需要输出错误
  • C++ 天花板函数的奇怪结果

    我一直在尝试天花板功能并得到一些奇怪的结果 如果我对十进制数乘以百执行 ceil 运算 我会得到一定的结果 但是 如果我直接对该乘法的结果执行 ceil 我会得到完全不同的输出 另一个问题是 这些不同的结果仅发生在某些数字上 任何帮助 将不
  • 子进程中的变量修改

    我正在研究科比和奥哈拉伦的作品Computer Systems A Programmer s Perspective 练习 8 16 要求程序的输出如下 我更改了它 因为他们使用了一个你可以在他们的网站上下载的头文件 include
  • 运行 C# exe 文件

    复制 为什么我的 NET 应用程序在从网络驱动器运行时会崩溃 https stackoverflow com questions 148879 why does my net application crash when run from
  • 二元运算符重载、隐式类型转换

    class my bool private bool value public my bool bool value value value explicit operator bool return value friend my boo
  • 如何设置cookie值?

    我正在执行以下操作来设置 cookie 值 HttpCookie mycookie new HttpCookie mycookie mycookie Value value1 Case sensitivity mycookie Expire
  • 尝试缓冲区溢出

    我正在尝试使用缓冲区溢出来更改函数的结果 以使用以下代码更改堆栈上的结果 include
  • Bool类型返回规则

    我使用 dapper ORM 所以我使用两个规则Query
  • 访问结构向量

    我有一个结构 struct OutputStore int myINT string mySTRING 如果我创建一个 OutputStore 类型的数组 如下所示 OutputStore OutputFileData new Output
  • 如何在 .NET 中自定义 JSON 枚举的反序列化?

    我有以下示例 C 代码 它是使用 svcutil exe 应用程序从 xsd 自动生成的 DataContract public enum Foo EnumMember Value bar Bar 1 EnumMember Value ba
  • C++头文件问题

    我在处理类时尝试了一些 C 代码 这个问题出现在我身上 并且让我有点烦恼 我创建了一个包含类定义的头文件和一个包含实现的 cpp 文件 如果我在不同的 cpp 文件中使用此类 为什么要包含头文件而不是包含类实现的 cpp 文件 如果我包含类
  • 向窗口句柄发送消息

    我尝试使用 sendmessage 将消息从我的 C 应用程序传递到 C 我的c 代码是这样的 int tmain int argc TCHAR argv COPYDATASTRUCT cpd cpd dwData 0 LPCWSTR st
  • 我的 Opencv 应用程序处理速度非常慢

    我正在构建一个 OpenCV 应用程序 它从相机捕获视频 并在删除背景后将其覆盖在另一个视频上 我无法达到合理的速度 因为它以大约 1 fps 的速度播放输出 而我的背景去除以 3 fps 的速度工作 有没有办法以正常速度显示背景视频并以
  • 使用可变参数模板函数计算多个值的平均值

    我正在尝试编写一个函数来确定任意数量参数的平均值 所有参数都具有相同的类型 出于学习目的 我尝试使用可变参数模板函数来做到这一点 这是我到目前为止所拥有的 template
  • 如何将此 Boost ASIO 示例应用到我的应用程序中

    我已经阅读了很多 ASIO 示例 但我仍然对如何在我的应用程序中使用它们感到困惑 基本上 我的服务器端需要接受超过100个连接 客户端 这部分是通过使用线程池 通常每个CPU核心2 4个线程 来完成的 为简单起见 我们假设只有一个连接 为了
  • Lambda 按值捕获和“mutable”关键字

    关键词的必要性mutable在 lambda 中 是造成极大混乱的根源 考虑代码 int x 10 function
  • 定义一个断言,即使定义了 NDEBUG,该断言也有效

    我想定义一个assert与标准相同的宏assert 3 http man7 org linux man pages man3 assert 3 html调用 但它不会被预处理器删除NDEBUG被定义为 这样的呼唤 让我们称之为assert2
  • InvalidOperationException:没有为方案“CookieSettings”注册身份验证处理程序

    我正在使用 ASP Net MVC core 2 1 开发一个应用程序 其中不断出现以下异常 InvalidOperationException 没有为方案 CookieSettings 注册身份验证处理程序 注册的方案有 Identity

随机推荐