如何在C++中用更少的空间定义类字段/方法
How can I define the class fields/methods in less space in C++
这是我的标题:
#ifndef MYCLASSES_H_
#define MYCLASSES_H_
#define ARRAY_SIZE(x) (sizeof((x)) / sizeof((x)[0]))
namespace mynamespace {
class A
{
class B
{
class C
{
void doStuff(B *pB);
}
static const C SOME_ARRAY[];
static const int SOME_ARRAY_COUNT;
}
}
} //namespace mynamespace
#endif /* MYCLASSES_H_ */
这就是CPP:
#include "myclasses.h"
namespace mynamespace {
void A::B::C::doStuff(A::B *pB)
{
/* ... */
}
const A::B::C A::B::SOME_ARRAY[] = {
/*...*/
};
const A::B::SOME_ARRAY_COUNT = ARRAY_SIZE(
} //namespace mynamespace
如何使.CPP文件中的定义具有较短的名称?它非常笨重。
一名男子走进一名医生。他说:"医生,我的头撞到墙上时很疼。"。医生说:"不要把你的头撞在墙上,你的头就会停止疼痛。"。
由于B和C在a级的私人区域,全世界都看不到他们。
所以没有必要把它们嵌套在A里,只需要让它们不被外界看到
实现这一点的简单方法是将它们放在源文件内的匿名命名空间中。
#ifndef MYCLASSES_H_
#define MYCLASSES_H_
#define ARRAY_SIZE(x) (sizeof((x)) / sizeof((x)[0]))
namespace mynamespace {
class A
{
}
} //namespace mynamespace
#endif /* MYCLASSES_H_ */
这就是CPP:
#include "myclasses.h"
namespace
{
// This is an anonymouse namespace
// It does not export it symbols outside the compilation unit.
// So only A should be able to see them
class B
{
static const C SOME_ARRAY[];
static const int SOME_ARRAY_COUNT;
};
class C
{
void doStuff(B *pB);
};
}
void C::doStuff(B *pB)
{
/* ... */
}
const C B::SOME_ARRAY[] = {
/*...*/
};
const B::SOME_ARRAY_COUNT = ARRAY_SIZE(
可以尝试使用using声明:
using A::B;
typedefs可以缩短命名:
#include "MYCLASSES.h"
namespace mynamespace {
typedef A::B b;
typedef b::C c;
void c::doStuff(b *pB)
{
/* ... */
}
const c b::SOME_ARRAY[100] = {
/*...*/
};
const int b::SOME_ARRAY_COUNT = ARRAY_SIZE(SOME_ARRAY);
} //namespace mynamespace
很遗憾,您不能。这只是C++的一个语法特性。
因此,您应该更喜欢C++中的平面嵌套层次结构:不要无休止地嵌套类,将它们放在同一个上层命名空间中。在其他语言中,这是一个很大的禁忌,因为它将实现细节泄露到公共接口1
C++中并非如此,因为这里有不同的编译单元来强制封装和信息隐藏。因此,扁平层次结构实际上在大多数情况下都很好。
1但即使在其他语言中,三个嵌套类也在突破极限。
没有干净的方法。如果是嵌套的命名空间,可以使用using
或namespace aliasing
。
既然是课堂,我能想到的最好的就是:
#define B A::B
#define C B::C
但它绝对不干净。我不会这么做。
除了之外,没有其他真正的方法可以做到这一点
#define AB mynamespace::A::B;
允许:
mynamespace::A::B::C myobj;
注意,许多程序员(包括我自己)认为这是一种糟糕的做法,因为AB是什么并不明显
成为:
AB::C myobj;
不能将"using"用于类,只能用于命名空间。因此,在cpp文件中,您可以执行以下操作:
using mynamespace;
A::B::C myobj;
但不是:
using mynamespace::A::B;
C myobj;
不过,一般来说,许多人都认为最好的做法是完全限定姓名。
或者,您可以在头文件中编写实现。不过,这是一种非常糟糕的做法。
相关文章:
- 在命名空间中定义函数还是限定函数
- 使用命名空间时出现多个定义错误
- 如何对命名空间限定类型进行类型定义?
- C++未定义的命名空间
- 命名空间更改函数定义
- 使用命名空间在另一个".cpp"文件中定义
- 在命名空间中声明变量,在 main 中定义它,使其对所有其他文件可见
- 在方法定义中显式指定命名空间
- 在命名空间中定义变量
- 如何为缺少预定义运算符而不扩展命名空间"std"的标准类型定义运算符>> (istream &, ...)?
- 如何理解c++中在命名空间内部定义的枚举类型enum
- 在 c++ 中使用类的命名空间定义类的成员
- 朋友定义函数的名称空间是什么
- cgo调用C++中定义的函数(位于命名空间中)
- 在内联命名空间中扩展最初在内联命名空间的封闭命名空间中定义的命名空间
- 将以"_[a-z0-9]"开头和"using"的标识符导入全局命名空间是否定义良
- 自定义提升前缀/命名空间 - 如何使用
- C++最佳实践 - 在多个命名空间中定义类
- 是否可以在相同的命名空间中,但在不同的嵌套项目中定义具有相同名称的类
- 如何在两个不同的命名空间(但只写一次)中使用相同的标头定义,命名空间有不同的实现?