Перечисления внутри класса C ++ - PullRequest
5 голосов
/ 06 мая 2011

Я пытаюсь использовать класс с объявленным внутри класса типом перечисления следующим образом:

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 # и обычно вижу перечисления, объявленные вне класса, а не внутри, как здесь.Как мне инициализировать тип enum.Например, я хочу сделать что-то вроде этого:

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

Очевидно, что это не работает.Как бы я это сделал?

Ответы [ 6 ]

9 голосов
/ 06 мая 2011

Сначала вам нужно объявить переменную типа XEnumType в вашем классе Затем вы можете получить доступ к фактическим значениям перечисления, используя имя класса для области: x::LINEAR или x::DIPARABOLIC

class x{
 //Your other stuff

XEnumType myEnum;
};

int main(void)
{
    x myNewClass();
    x.myEnum = x::LINEAR;
}
6 голосов
/ 06 мая 2011

Во-первых: не используйте typedef.Вместо этого поместите имя перечисления в его заголовок

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

В двух словах, если вы сделаете так, как вы, то будете вести себя , в основном , так же, но в тайных угловых случаях все будет иначе.Синтаксис, который вы использовали, будет сильно отличаться от синтаксиса, который я использовал выше только в C.

Второе: это просто определяет тип.Но вы хотите определить объект этого перечисления.Сделайте так:

XEnumType e;

В итоге:

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;
}
4 голосов
/ 06 мая 2011
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;
};

Использование:

x myX(10);
myX.my_enum = LINEAR;
2 голосов
/ 06 мая 2011

Вы объявили новый тип: XEnumType. Вы должны создать поле этого типа внутри класса x. , Например:

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

Тогда вы можете получить к нему доступ таким образом:

x foo(10);
foo.type = LINEAR;
0 голосов
/ 08 января 2018

Позвольте мне сначала предположить некоторые предварительные условия:

  • Класс x из сторонней библиотеки и, следовательно, не может быть изменен.
  • Класс x определяет некоторые целочисленные константыс помощью перечисления.
  • Предполагается, что класс x инициализируется одной из констант LINEAR или DIPARABOLIC.

Ваша проблема в том, что этиконстантные значения объявлены в классе x.Таким образом, чтобы инициализировать экземпляр x, вам нужно указать область:

Вместо

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

try

x myX(x::LINEAR);

Указав x::, вы предоставляетеобласть действия константы.

0 голосов
/ 06 мая 2011

линия

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

определяет тип , называемый XEnumType, на самом деле это все равно избыточно - предпочитайте что-то вроде:

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

Теперь вам нужно определить члена этого типа в вашем классе

XEnumType _eType;

В вашем конструкторе вы можете инициализировать что угодно

x::x(int ) : _eType(x::LINEAR) {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...