C++ C++;名称空间作为模块?

C++ C++;名称空间作为模块?,c++,C++,过去,我会写这样的类: // my_class.h class MyClass { public: // Signals emitted by MyClass objects. typedef boost::signal<..> SignalA; typedef boost::signal<..> SignalB; enum SomeEnum { .. }; enum AnotherEnum

过去,我会写这样的类:

// my_class.h

class MyClass
{
public:
    // Signals emitted by MyClass objects.
    typedef boost::signal<..> SignalA;
    typedef boost::signal<..> SignalB;

    enum SomeEnum
    {
        ..
    };

    enum AnotherEnum
    {
        ..
    };

    typedef some_type SomeOtherType;

    // an exception thrown by MyClass objects
    class ExceptionA
    {
        ..
    };

    MyClass();

   // rest of class definition omitted
};
//my_class.h
类MyClass
{
公众:
//MyClass对象发出的信号。
类型DEF增压::信号信号A;
类型DEF增压::信号信号B;
枚举某物枚举
{
..
};
无柄枚举
{
..
};
typedef some_type somether type;
//MyClass对象引发的异常
班级例外
{
..
};
MyClass();
//省略了类的其余部分定义
};
我一直讨厌这种风格,因为它使类声明变得复杂。所以在最近的一个项目中,我决定尝试一些新的东西。我决定以类似于Python中模块的方式使用名称空间(在我工作的地方,我们也经常使用Python):

//my_class.h
名称空间my_类
{
//MyClass对象发出的信号。
类型DEF增压::信号信号A;
类型DEF增压::信号信号B;
枚举某物枚举
{
..
};
无柄枚举
{
..
};
typedef some_type somether type;
//MyClass对象引发的异常
班级例外
{
..
};
类MyClass
{
公众:
MyClass();
..
};
}
结果还不错。唯一的缺点是,你总是必须在所有事情之前加上前缀“my_class::”。但这可以通过使用“using”语句来缓解


我要开始另一个项目,我想再做一次。采用这种名称空间的方法是否有任何严重的缺点(除了增加冗长的内容)呢?

除了名称my_类之外,这应该没问题。事实上,这就是名称空间的用途。

这正是您应该做的。需要记住的一点是,您希望避免名称空间之间的循环依赖关系。此外,最好每个名称空间对应一个单独的库。这也意味着您应该避免将名称空间嵌套得太深。也许您的公司可以使用一个顶级名称空间来区别于第三方代码,然后是另一个级别的名称空间来区分各个组件。

我想说,增加的详细程度是一件好事,并且几乎完全停止使用
using
语句。仍然将其用于深度嵌套的名称空间,如Boost中的名称空间。在我的项目中,我也有很多嵌套的(只有几个级别)名称空间,几乎唯一不在名称空间中的代码是
main
函数。将其命名为“my_类”的原因是它是以“primary”命名的由该名称空间提供的类,但使用由下划线样式分隔的单词而不是PascalCasing。这类似于Python中经常使用的样式,其中模块名为myclass(出于某种原因,他们不喜欢在其中使用下划线),myclass.py提供的类名为myclass。当我第一次开始使用名称空间时,我尝试将所有内容包装在以产品命名的名称空间中。后来,当我想在另一个产品中使用该产品的一个组件时,这变成了一种痛苦。它要么保留以旧产品命名的名称空间(看起来很笨拙,可能会令人困惑),要么执行搜索和替换以将产品名称更改为新产品的名称(可能会引入错误)。不过,将所有内容包装在以我工作的公司命名的名称空间下是合理的,因为这在不同的项目中最不可能改变
// my_class.h

namespace my_class
{
    // Signals emitted by MyClass objects.
    typedef boost::signal<..> SignalA;
    typedef boost::signal<..> SignalB;

    enum SomeEnum
    {
        ..
    };

    enum AnotherEnum
    {
        ..
    };

    typedef some_type SomeOtherType;

    // an exception thrown by MyClass objects
    class ExceptionA
    {
        ..
    };

    class MyClass
    {
    public:
        MyClass();
        ..
    };
}