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

2024-04-27

使用嵌套公共 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;

我可以看到嵌套私有枚举/类的好处,但是当涉及公共枚举/类时,办公室是分裂的 - 这似乎更多是一种风格选择。

那么,您更喜欢哪一个,为什么?


嵌套类

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

让我们想象一下以下代码:

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 ;

正是针对此类问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用嵌套 C++ 类和枚举的优点和缺点? 的相关文章

随机推荐

  • 在 bash 脚本中获取星期几

    我想在变量中包含星期几DOW 所以我使用以下 bash 脚本 DOM date d DOW DOM 7 sed s 0 不幸的是我收到这个错误 bash 09 command not found 变量中的预期结果为 2 9 7 2 DOW
  • 在 Ubuntu 12.04 中打开 eclipse juno 并出现错误“No more handles ...”

    从今天开始 每次我打开 Eclipse 时 都会弹出一个标题为 出现问题 的消息框 内容如下 不再处理 未知的 Mozilla 路径 未设置 MOZILLA FIVE HOME 可能的参数 0 1 2 3 不再有句柄 未知的 Mozilla
  • Wicket setResponsePage() 方法如何工作?

    在学习 JSP 和 servlet 时 我听说了重定向和调度 他们中的哪一个做 Wicket 的setResponsePage 履行 What setResponsePage确实取决于几个因素 您调用 setResponsePage 的次数
  • 仅使用视频标签实时流式传输到 HTML5(不带 webrtc)

    我想将实时编码数据包装到 webm 或 ogv 并将其发送到 html5 浏览器 webm 或 ogv 可以做到这一点吗 Mp4 由于其 MDAT 原子而无法做到这一点 无法实时将h264和mp3打包并发送给客户端 假设我正在从网络摄像头输
  • 为什么 Swift 中委托方法需要公开?

    我正在快速开发一个框架 我正在创建一个处理框架中 BLE 内容的类 这个类应该是公共的 因为我需要从使用我的框架的外部应用程序访问这个类 我的班级结构如下 public class MyClass NSObject CBCentralMan
  • Typescript 2 中分号是必需的吗?

    我一直在寻找这个问题的答案 但收到的信息很复杂 我知道分号在 JavaScript 中是必需的 因为自动分号插入 ASI 但是 TypeScript 是否有相同的限制 我认为它不会 因为它会转换为 JavaScript 并且很可能会在 AS
  • 谷歌折线图:如何添加单位?

    https google developers appspot com chart interactive docs gallery linechart Example https google developers appspot com
  • React 项目中的 Typescript 不再识别“as”关键字

    我将 react scripts 升级到最新版本 以消除 在定义之前使用 React 错误 我还升级到了最新版本的打字稿 现在我收到以下信息 Failed to compile src components NearBy tsx Line
  • ActionBar 上的自定义主页按钮

    我正在使用 ActionBar Sherlock 库 所以 要更改默认的主页按钮 我这样做了 这不起作用 所以 我也添加了这个
  • HTML5 下载属性不适用于 Mozilla [重复]

    这个问题在这里已经有答案了 a class download btn href https example com test pdf target blank Download a 我上面有简单的下载链接html5代码 它在 mozilla
  • 导入数千条记录后无法推送到 Heroku

    我有一个问题 我认为我的 sqlite3 数据库太大 我将大约 100 000 条记录导入到数据库中 并且能够 git Push 和 git Push heroku 现在我可能犯了一个错误 导入了太多记录 500 000 我能够推送到 gi
  • Django - 在设置中使用反向 url 映射

    例如 django 设置文件中的一些选项是 urlLOGIN URL and LOGIN REDIRECT URL 是否可以避免对这些 url 进行硬编码 而使用反向 url 映射 目前 这确实是我发现自己在多个地方编写相同网址的唯一地方
  • 是否可以阻止对象的堆栈分配并只允许使用“new”实例化它?

    是否可以阻止对象的堆栈分配并只允许在堆上使用 new 来启动它 实现此目的的一种方法是将构造函数设为私有 并且只允许通过返回指针的静态方法进行构造 例如 class Foo public Foo static Foo createFoo r
  • 使用vba分割和重命名pdf文件

    我收到了一份包含多张工资单的合并文件 每张工资单上的特定位置都有一个特定的数字 我希望使用这个确切的数字作为每个文件名 例如37224 pdf 我尝试使用下面的 VBA 代码将工资单拆分并命名为单独的工资单 Option Explicit
  • Hibernate - 一对多关系和孤儿删除级联

    我有一个基本的一对多关系父 子关系 就像 Hibernate 参考书第 21 章中一样 级联仅从子级到父级 保留级联只是因为我不想在删除子级时删除父级 当我向父级添加一个子级并保存该子级时 出现 TransientObjectExcepti
  • 上下文保留评估

    我们正在构建一个小型 REPL 来评估 使用eval 用户输入的 JavaScript 表达式 由于整个事情是事件驱动的 因此评估必须在单独的函数中进行 但必须在调用之间保留上下文 即所有声明的变量和函数 我想出了以下解决方案 functi
  • 在 Jekyll 中,如何更改将文件名转换为博客文章标题的大小写规则?

    我正在尝试更改 Jekyll 中博客文章标题的大小写 而不必每次都在 yaml 标题字段中键入它 默认情况下 jekyll 转换文件2016 02 22 my blog title标题 我的博客标题 我希望它是 我的博客标题 我注意到我可以
  • 如何使用 ASP classic 进行重定向

    我想从一个 URL 重定向到另一个 URL http female deals com http male deals com 如何通过在浏览器中将 URL 更改为新 URL 以及页面直接转到新 URL 而无需转到旧 URL 并进行刷新来实
  • Py2Exe“缺少以下模块”

    使用 Py2Exe 时 我收到警告 例如 The following modules appear to be missing Crypto Crypto Cipher Crypto Hash Padding 由于找不到这些模块 导致 EX
  • 使用嵌套 C++ 类和枚举的优点和缺点?

    使用嵌套公共 C 类和枚举的优点和缺点是什么 例如 假设您有一个名为printer 并且此类还存储输出托盘上的信息 您可以 class printer public std string name enum TYPE TYPE LOCAL