【问题标题】:Modules Design in C++C++中的模块设计
【发布时间】:2011-01-26 13:47:05
【问题描述】:

我是这个网站的新手,我想问你一些关于 C++ 的问题,因为我最近正在学习它,而且我是菜鸟(我只知道 C 和 Java)。

我正在使用 Stroustrup 书,但我仍然不了解类和命名空间之间的用途和区别。

我还为某个主题(操作系统)编写了一些 C 程序,我想将它们全部加入 C++ 程序中。我的想法是创建一些模块(因为程序依赖但它们用于不同的目的)。而且我还有一个“main.cpp”文件,其中定义了一个由模块多次调用的帮助函数,检查模块是否可用,如果是,您可以选择所需模块的功能(取决于你传递的参数)。

但问题是我不知道这样做的更好方法是什么。我应该使用什么?类或命名空间?我怎样才能做一个好的设计?我考虑过使用如下设计:

main.cpp

--> ModuleA.cpp(实现InterfaceA.h)

--> ModuleB.cpp(实现InterfaceB.h)

--> ModuleC.cpp(实现InterfaceC.h)

我在这个网络上搜索了一些其他类似的问题,我发现了类似 this one 的东西,但我认为这对于我的简单程序来说太复杂了。

非常感谢:)

【问题讨论】:

    标签: c++ module


    【解决方案1】:

    仅使用它们自己的命名空间不会走得太远 :) 它们所做的一切(顾名思义)就是为类型提供命名空间,以防止污染全局命名空间,并防止相同类型名称之间发生冲突。因此,一个 API 拥有一个包含它所拥有的所有内容的外部命名空间是很常见的,从而防止与其他 API 发生冲突:

    namespace MoosLibrary
    {
        typedef boost::uuids::uuid Uuid;  // Moo's unique identifier!
    };
    
    
    
    namespace AnotherLibrary
    {
        typedef int Uuid;          // this library uses integers for unique identifiers
    };
    

    在上面的 sn-p 中,如果没有命名空间,两个 Uuid 类型会发生冲突,导致无法解释的编译错误和编程头痛。但是,通过将它们划分为单独的命名空间,我们可以避免这些类型的冲突。请注意以上示例中的boost::uuids::uuid。那里有两个命名空间。boost 是 boost C++ 库(当你达到 C++ 的那个级别时强烈推荐!),uuids 是 boost 中专用于该库特定部分的命名空间。

    因此,从这里我们可以看出,命名空间不仅有助于防止类型之间的冲突,它还允许您将项目构建到逻辑命名空间中,这样全局命名空间就不会充满类型。当您的 IDE 支持智能感知时,这真的很简洁。

    namespace MoosLibrary
    {
        namespace Logic
        {
            // logic related classes/types
        }
    
        namespace UI
        {
            // user-interface
        }
    }
    

    注意:detail 是一个命名空间,它具有与之关联的不成文规则。它基本上是 API 编写者放置需要公开可见但不搞砸的东西的地方。

    【讨论】:

    • 命名空间后面的;是多余的。
    • @Matthieu,你是对的,当然。这只是我的一个习惯。
    • 它确实具有一致性的价值:)
    【解决方案2】:

    如果您了解 Java,那么只需将 C++ 命名空间视为 Java 包,将 C++ 类视为 Java 类。

    一般来说,每个源文件最好有一个类。如果您有相关的类,您可能希望将它们全部放在同一个命名空间中。

    【讨论】:

    • 我要补充一点,没有与 java 的包可访问性等效的东西。 C++ 只有公有、受保护和私有。 (还有friend s,但这在java中没有真正的类似物)
    猜你喜欢
    • 2014-01-26
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 2014-03-25
    相关资源
    最近更新 更多