枚举在C ++类中

Enums inside of a C++ class

我正在尝试使用一个类,该类在类内声明了枚举类型,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
class x {
public:
    x(int);
    x( const x &);
    virtual ~x();
    x & operator=(const x &);
    virtual double operator()() const;

    typedef enum  {
        LINEAR = 0,      /// Perform linear interpolation on the table
        DIPARABOLIC = 1  /// Perform parabolic interpolation on the table
    } XEnumType;
};

我需要声明这个类的一个实例并初始化枚举类型。我来自C,通常会看到在类外部声明的枚举,而不是在类内部声明的枚举。如何初始化枚举类型。例如,我想这样做:

1
2
x myX(10);  
myX.XEnumType = Linear;

显然这不起作用。我该怎么做?


首先,您需要在类中声明一个类型为XEnumType的变量。然后,可以使用作用域的类名访问实际的枚举值:x::LINEARx::DIPARABOLIC

1
2
3
4
5
6
7
8
9
10
11
class x{
 //Your other stuff

XEnumType myEnum;
};

int main(void)
{
    x myNewClass();
    x.myEnum = x::LINEAR;
}


第一:不要使用typedef。相反,将枚举的名称放在其头部

1
2
3
4
enum XEnumType {
    LINEAR = 0,      /// Perform linear interpolation on the table
    DIPARABOLIC = 1  /// Perform parabolic interpolation on the table
};

简而言之,像你那样做的行为基本上是一样的,但在神秘的角落里情况会有所不同。您使用的语法将与我在上面仅在C中使用的语法有很大的不同。

第二:这只是定义了一个类型。但您要定义该枚举的对象。这样做:

1
XEnumType e;

总之:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class x {
    /* ... stays the same ... */

    enum XEnumType {
        LINEAR = 0,      /// Perform linear interpolation on the table
        DIPARABOLIC = 1  /// Perform parabolic interpolation on the table
    };

    XEnumType e;
};

void someFunction() {
    x myX(10);
    myX.e = x::LINEAR;
}


1
2
3
4
5
6
7
8
9
10
11
12
13
enum XEnumType {
    LINEAR, DIPARABOLIC
};

class x {    
    public:    
      x(int);    
      x( const x &);    
      virtual ~x();    
      x & operator=(const x &);    
      virtual double operator()() const;    
      XEnumType my_enum;
};

使用:

1
2
x myX(10);
myX.my_enum = LINEAR;


您声明了一个新类型:XenumType。必须在X类内创建该类型的字段。.例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class x {

public:

x(int);

x( const x &);

virtual ~x();

x & operator=(const x &);

virtual double operator()() const;

typedef enum  {
    LINEAR = 0,      /// Perform linear interpolation on the table
    DIPARABOLIC = 1  /// Perform parabolic interpolation on the table
} XEnumType;
public:
XenumType type;
};

然后您可以通过以下方式访问它:

1
2
x foo(10);
foo.type = LINEAR;


让我先假设一些先决条件:

  • x来自第三方库,因此不能更改。
  • x在枚举的帮助下定义了一些整型常量。
  • x应该用一个常量LINEARDIPARABOLIC初始化。
  • 小精灵

    您的问题是这些常量值是在类x中声明的。因此,要初始化x的实例,需要指定范围:

    而不是

    1
    2
    x myX(10);  
    myX.XEnumType = Linear;

    尝试

    1
    x myX(x::LINEAR);

    通过指定x::可以提供常量的范围。


    这条线

    1
    2
    3
    4
    typedef enum  {
        LINEAR = 0,      /// Perform linear interpolation on the table
        DIPARABOLIC = 1  /// Perform parabolic interpolation on the table
    } XEnumType;

    定义了一个名为XEnumType的类型,实际上这是多余的—更喜欢这样的类型:

    1
    2
    3
    4
    5
    enum XEnumType
    {
      LINEAR = 0,      /// Perform linear interpolation on the table
      DIPARABOLIC = 1  /// Perform parabolic interpolation on the table
    };

    现在,您需要在类中定义此类型的成员

    1
    XEnumType _eType;

    在构造函数中,然后可以初始化为

    1
    x::x(int ) : _eType(x::LINEAR) {}