头文件没有显式编写命名空间

Cha*_*lta 8 c++

在C++实现文件中,我可以选择编写类似于:

name::space::ClassName::someFunction(int param) {
    // impl
}
Run Code Online (Sandbox Code Playgroud)

代替

namespace name {
    namespace space {
        ClassName::someFunction(int param) {
            // impl
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我发现它非常方便,更具可读性.这可以以某种方式在头文件中使用吗?像这样的东西:

class name::space::ClassName {
    // declarations
};
Run Code Online (Sandbox Code Playgroud)

代替

namespace name {
    namespace space {
        class ClassName {
            // declarations
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

如果这样的事情是可能的,那么在哪些条件下呢?我可以想象,一个人需要转发声明命名空间向前声明命名空间中的类,如下所示:

namespace name {
    namespace space {
        class ClassName;
    }
}
Run Code Online (Sandbox Code Playgroud)

在能够使用之前:

class name::space::ClassName {
    // declarations
};
Run Code Online (Sandbox Code Playgroud)

在头文件中.

但不知怎的,我无法让这个工作1].它甚至可能吗?困扰我的是,使用嵌套命名空间我必须缩进2个选项卡,直到我能够实际声明我的类.我想在我的头文件中使用该空间,但我不想省略选项卡,因为这将违反"花括号中的所有内容需要标记一次"-rule(我不知道是否有这个的实际名称.如果有,请原谅我的无知,我不知道:S

1]我遇到的问题与问题无关.这种方法确实有效,但它有缺点(见接受的答案).

Bo *_*son 6

不,它不起作用.一个问题是

namespace name {
    namespace space {
        class ClassName {
            // declarations
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以看出它是两个命名空间和一个类.

然而,随着

class name::space::ClassName {
    // declarations
}
Run Code Online (Sandbox Code Playgroud)

你不知道space是命名空间还是包含嵌套的类ClassName.

可以做的是节省你的标签.可以写

namespace name { namespace space {
    class ClassName {
        // declarations
    }
}}
Run Code Online (Sandbox Code Playgroud)


小智 6

如果您只是不希望命名空间括号包含您的类定义,那么您当然可以通过在其他地方使用类声明来定义命名空间来实现这一点.这样,你可以想出这样的东西:

#ifndef MYCLASS_H
#define MYCLASS_H

namespace ClassNamespace { class MyClass; };

class ClassNamespace::MyClass
{
public:
    MyClass();
    ~MyClass();
    void a();
private:

};

#endif // MYCLASS_H
Run Code Online (Sandbox Code Playgroud)

为标题和这:

#include "MyClass.h"

#include <iostream>

using namespace std;

ClassNamespace::MyClass::MyClass()
{
}

ClassNamespace::MyClass::~MyClass()
{
}

void ClassNamespace::MyClass::a()
{
    cout << "hello";
}
Run Code Online (Sandbox Code Playgroud)

为实施.

如您所见,命名空间不包含类定义,只包含其声明.

作为最后一点,我个人不知道你为什么要这样做或者认为它看起来更好看.我个人更愿意看到命名空间封装了类定义以及函数定义.但也许我一直都是奇怪的......

  • 我很难解释为什么我更喜欢它.如果我不想在使用封装的命名空间时省略tab键,我发现它更具可读性.你的答案:这实际上有用吗?我真的很喜欢这种方法.此外,如果我使用一个专用头,其中定义了项目的所有命名空间,我可以更好地记录它们(仅在一个地方,而不是在使用命名空间关键字的每个位置).另一方面,缺点很明显; 你必须维护另一个文件并将其包含在任何地方...... (2认同)