gpt4 book ai didi

c++ - 没有显式写命名空间的头文件

转载 作者:可可西里 更新时间:2023-11-01 17:25:11 25 4
gpt4 key购买 nike

在 C++ 实现文件中,我可以选择编写如下内容:

name::space::ClassName::someFunction(int param) {
// impl
}

代替

namespace name {
namespace space {
ClassName::someFunction(int param) {
// impl
}
}
}

我发现它非常方便且更具可读性。这也可以以某种方式用于头文件中吗?像这样:

class name::space::ClassName {
// declarations
};

代替

namespace name {
namespace space {
class ClassName {
// declarations
};
}
}

如果这样的事情是可能的,那么在什么条件下?我可以想象,需要像这样 forward declare the namespace forward declare the classes in the namespace:

namespace name {
namespace space {
class ClassName;
}
}

在能够使用它之前:

class name::space::ClassName {
// declarations
};

在头文件中。

但不知何故我无法让它工作1]。有可能吗?令我困扰的是,对于嵌套的命名空间,我必须缩进 2 个选项卡,直到我可以真正声明我的类。我想在我的头文件中使用该空间,但我不想省略制表符,因为这将违反“大括号中的所有内容都需要制表一次”规则(我不知道是否有这个的实际名称。如果有,请原谅我的无知,我不知道:S

1] 我遇到的问题与问题无关。该方法确实有效,但也有缺点(请参阅已接受的答案)。

最佳答案

如果您只是不想让命名空间大括号包围您的类定义,您当然可以通过在其他地方定义命名空间,只在其中包含类声明来实现这一点。这样,你就可以想出这样的东西:

#ifndef MYCLASS_H
#define MYCLASS_H

namespace ClassNamespace { class MyClass; };

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

};

#endif // MYCLASS_H

对于标题和这个:

#include "MyClass.h"

#include <iostream>

using namespace std;

ClassNamespace::MyClass::MyClass()
{
}

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

void ClassNamespace::MyClass::a()
{
cout << "hello";
}

用于实现。

如您所见,命名空间不包含类定义,只包含它的声明。

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

关于c++ - 没有显式写命名空间的头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32074340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com