gpt4 book ai didi

c++ - 使用嵌套 C++ 类和枚举的优缺点?

转载 作者:IT老高 更新时间:2023-10-28 14:00:27 42 4
gpt4 key购买 nike

使用嵌套的公共(public) C++ 类和枚举有哪些优缺点?例如,假设您有一个名为 printer 的类,并且该类还存储输出托盘上的信息,您可以:

class printer
{
public:
std::string name_;

enum TYPE
{
TYPE_LOCAL,
TYPE_NETWORK,
};

class output_tray
{
...
};
...
};

printer prn;
printer::TYPE type;
printer::output_tray tray;

或者:

class printer
{
public:
std::string name_;
...
};

enum PRINTER_TYPE
{
PRINTER_TYPE_LOCAL,
PRINTER_TYPE_NETWORK,
};

class output_tray
{
...
};

printer prn;
PRINTER_TYPE type;
output_tray tray;

我可以看到嵌套私有(private)枚举/类的好处,但是当涉及到公共(public)枚举/类时,办公室是分开的——这似乎更像是一种风格选择。

那么,你更喜欢哪个,为什么?

最佳答案

嵌套类

嵌套在类中的类有几个副作用,我通常认为是缺陷(如果不是纯粹的反模式)。

让我们想象下面的代码:

class A
{
public :
class B { /* etc. */ } ;

// etc.
} ;

甚至:

class A
{
public :
class B ;

// etc.
} ;

class A::B
{
public :

// etc.
} ;

所以:

  • 特权访问: A::B 拥有对 A 的所有成员(方法、变量、符号等)的特权访问,这削弱了封装性
  • A 的作用域是符号查找的候选对象: B 内部的代码会将 A 中的 所有 个符号视为符号查找的候选对象,这可能会混淆代码
  • 前向声明:没有完整的 A 声明就无法前向声明 A::B
  • 可扩展性:除非您是 A 的所有者,否则无法添加另一个类 A::C
  • 代码冗长:将类放入类只会使标题变大。您仍然可以将其分成多个声明,但无法使用类似命名空间的别名、导入或使用。

作为结论,除非有异常(exception)(例如,嵌套类是嵌套类的亲密部分......即使那样......),我认为在普通代码中嵌套类没有任何意义,因为缺陷比数量级大感知到的优势。

此外,在不使用 C++ 命名空间的情况下模拟命名空间是一种笨拙的尝试。

在专业方面,您隔离此代码,如果是私有(private)的,则使其无法使用,但来自“外部”类...

嵌套枚举

优点:一切。

缺点:什么都没有。

事实上枚举项会污染全局范围:

// 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 ;

正是针对这类问题。

关于c++ - 使用嵌套 C++ 类和枚举的优缺点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/216748/

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