当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用嵌套C++类和枚举的优缺点?》经验,为你挑选了2个好方法。

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

我可以看到嵌套私人枚举/课程的好处,但是当谈到公共场所/办公室时,办公室就分开了 - 它似乎更像是一种风格选择.

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



1> paercebal..:

嵌套类

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

让我们想象下面的代码:

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.

代码详细程度:将类放入类只会使标题更大.你仍然可以将它分成多个声明,但是没有办法使用类似命名空间的别名,导入或使用.

作为一个结论,除非例外(例如嵌套类是嵌套类的一个私密部分......即便如此......),我认为普通代码中的嵌套类没有任何意义,因为缺陷超出了大小的感知优势.

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

在pro方面,你隔离了这个代码,如果是私有的,那么它就无法使用,但是来自"外部"类......

嵌套枚举

优点:一切.

骗局:没什么.

事实是枚举项将污染全球范围:

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

正是出于这种问题.


嵌套私有类的好例子是std :: list中列表中的链接.没有人知道他们使用它们或与它们交互(或者它们甚至真的存在;-)

2> Adam Rosenfi..:

对于大型项目来说,一个可能成为大问题的骗局是,无法对嵌套类或枚举进行前向声明.

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有