Rob*_*Rob 44 c++ enums nested class
使用嵌套的公共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;
Run Code Online (Sandbox Code Playgroud)
或者:
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;
Run Code Online (Sandbox Code Playgroud)
我可以看到嵌套私人枚举/课程的好处,但是当谈到公共场所/办公室时,办公室就分开了 - 它似乎更像是一种风格选择.
那么,你更喜欢哪个?为什么?
pae*_*bal 44
嵌套在类中的类有几个副作用我通常认为是缺陷(如果不是纯粹的反模式).
让我们想象下面的代码:
class A
{
public :
class B { /* etc. */ } ;
// etc.
} ;
Run Code Online (Sandbox Code Playgroud)
甚至:
class A
{
public :
class B ;
// etc.
} ;
class A::B
{
public :
// etc.
} ;
Run Code Online (Sandbox Code Playgroud)
所以:
作为一个结论,除非例外(例如嵌套类是嵌套类的一个私密部分......即便如此......),我认为普通代码中的嵌套类没有任何意义,因为缺陷超出了大小的感知优势.
此外,在不使用C++命名空间的情况下,它模仿命名空间是一种笨拙的尝试.
在pro方面,你隔离了这个代码,如果是私有的,那么它就无法使用,但是来自"外部"类......
优点:一切.
骗局:没什么.
事实是枚举项将污染全球范围:
// collision
enum Value { empty = 7, undefined, defined } ;
enum Glass { empty = 42, half, full } ;
// empty is from Value or Glass?
Run Code Online (Sandbox Code Playgroud)
通过将每个枚举放在不同的命名空间/类中,可以避免这种冲突:
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 ;
Run Code Online (Sandbox Code Playgroud)
请注意,C++ 0x定义了类枚举:
enum class Value { empty, undefined, defined } ;
enum class Glass { empty, half, full } ;
// Value e = Value::empty ;
// Glass f = Glass::empty ;
Run Code Online (Sandbox Code Playgroud)
正是出于这种问题.