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

基本枚举类继承

如何解决《基本枚举类继承》经验,为你挑选了4个好方法。

是否有一种模式可以从C++中的另一个枚举继承枚举?

像这样的东西:

enum eBase 
{
   one=1, two, three
};


enum eDerived: public eBase
{
   four=4, five, six
};

Mykola Golub.. 90

#include 
#include 

class Enum
{
public:
    enum
    {
        One = 1,
        Two,
        Last
    };
};

class EnumDeriv : public Enum
{
public:
    enum
    {
        Three = Enum::Last,
        Four,
        Five
    };
};

int main()
{
    std::cout << EnumDeriv::One << std::endl;
    std::cout << EnumDeriv::Four << std::endl;
    return 0;
}

这不行.当你定义一些函数`int basic(EnumBase b){return b; }`和`int derived(EnumDeriv d){return d; 这些类型不能转换为`int`,尽管普通的枚举是.当你尝试这样简单的代码时:`cout << basic(EnumBase :: One)<< endl;`,然后你会得到一个错误:`从'EnumBase :: '转换为非标量类型'EnumBase'请求`.通过添加一些转换运算符可能可以克服这些问题. (20认同)


Brian R. Bon.. 62

不可能.枚举没有继承.

您可以使用具有命名const int的类.

例:

class Colors
{
public:
  static const int RED = 1;
  static const int GREEN = 2;
};

class RGB : public Colors
{
  static const int BLUE = 10;
};


class FourColors : public Colors
{
public:
  static const int ORANGE = 100;
  static const int PURPLE = 101;
};


Kirill V. Ly.. 10

你不能做到这一点直接,但你可以尝试使用的解决方案,从这个文章.

主要思想是使用包含枚举值的helper模板类,并具有类型转换操作符.考虑到枚举的基础类型,int您可以在代码中无缝地使用此持有者类而不是枚举.



1> Mykola Golub..:
#include 
#include 

class Enum
{
public:
    enum
    {
        One = 1,
        Two,
        Last
    };
};

class EnumDeriv : public Enum
{
public:
    enum
    {
        Three = Enum::Last,
        Four,
        Five
    };
};

int main()
{
    std::cout << EnumDeriv::One << std::endl;
    std::cout << EnumDeriv::Four << std::endl;
    return 0;
}


这不行.当你定义一些函数`int basic(EnumBase b){return b; }`和`int derived(EnumDeriv d){return d; 这些类型不能转换为`int`,尽管普通的枚举是.当你尝试这样简单的代码时:`cout << basic(EnumBase :: One)<< endl;`,然后你会得到一个错误:`从'EnumBase :: '转换为非标量类型'EnumBase'请求`.通过添加一些转换运算符可能可以克服这些问题.

2> Brian R. Bon..:

不可能.枚举没有继承.

您可以使用具有命名const int的类.

例:

class Colors
{
public:
  static const int RED = 1;
  static const int GREEN = 2;
};

class RGB : public Colors
{
  static const int BLUE = 10;
};


class FourColors : public Colors
{
public:
  static const int ORANGE = 100;
  static const int PURPLE = 101;
};



3> Kirill V. Ly..:

你不能做到这一点直接,但你可以尝试使用的解决方案,从这个文章.

主要思想是使用包含枚举值的helper模板类,并具有类型转换操作符.考虑到枚举的基础类型,int您可以在代码中无缝地使用此持有者类而不是枚举.



4> Огњен Шобаји..:

不幸的是,在C++ 14中是不可能的.我希望我们在C++ 17中有这样的语言功能.由于您已经为您的问题找到了一些解决方法,因此我不会提供解决方案.

我想指出,措辞应该是"延伸"而不是"继承".扩展允许更多的值(在您的示例中,您从3跳到6个值),而继承意味着将更多约束放到给定的基类中,因此可能性会缩小.因此,潜在的铸造将与继承完全相反.您可以将派生类强制转换为基类,而不是反过来继承类继承.但是当有扩展时,你"应该"能够将基类强制转换为扩展而不是反之.我说"应该"因为,正如我所说,这样的语言功能仍然不存在.

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