嵌套类
嵌套在类中的类有几个副作用,我通常认为这些副作用是缺陷(如果不是纯粹的反模式)。
让我们想象一下以下代码:
class A
{
public :
class B { /* etc. */ } ;
// etc.
} ;
Or even:
class A
{
public :
class B ;
// etc.
} ;
class A::B
{
public :
// etc.
} ;
So:
-
特权访问:A::B 对 A 的所有成员(方法、变量、符号等)有特权访问,这削弱了封装性
-
A 的范围是符号查找的候选范围:B 内部的代码将会看到allA 中的符号作为符号查找的可能候选者,这可能会混淆代码
-
前向声明:如果不给出 A 的完整声明,就无法前向声明 A::B
-
可扩展性:除非您是 A 的所有者,否则不可能添加另一个 A::C 类
-
代码冗长:将类放入类中只会使标题变大。您仍然可以将其分成多个声明,但无法使用类似命名空间的别名、导入或使用。
作为结论,除非有例外(例如,嵌套类是嵌套类的亲密部分......即使如此......),我认为普通代码中的嵌套类没有任何意义,因为缺陷的重要性超过了感知到的优点。
此外,它听起来像是在不使用 C++ 命名空间的情况下模拟命名空间的笨拙尝试。
在专业方面,您隔离此代码,如果是私有的,则使其无法使用,但来自“外部”类......
嵌套枚举
优点:一切。
缺点:没什么。
事实上,枚举项会污染全局范围:
// collision
enum Value { empty = 7, undefined, defined } ;
enum Glass { empty = 42, half, full } ;
// empty is from Value or Glass?
只有将每个枚举放在不同的命名空间/类中才能避免这种冲突:
namespace Value { enum type { empty = 7, undefined, defined } ; }
namespace Glass { enum type { empty = 42, half, full } ; }
// Value::type e = Value::empty ;
// Glass::type f = Glass::empty ;
请注意,C++0x 定义了类枚举:
enum class Value { empty, undefined, defined } ;
enum class Glass { empty, half, full } ;
// Value e = Value::empty ;
// Glass f = Glass::empty ;
正是针对此类问题。