2016-04-16 6 views
0

Борьба бит с правильным способом реализации класса и перечисления в C++.Использование классов и перечислений в C++

class CrossingGateRoad { 
    public: 
     boolean PowerOn(byte relayNumber) { 
      digitalWrite(relayNumber, RELAY_ON); 
      return true; 
     } 
     boolean PowerOff(byte relayNumber) { 
      digitalWrite(relayNumber, RELAY_OFF); 
      return true; 
     } 
}; 

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

enum { 
    CROSSINGZONE_CLEAR, // no train in crossing area, also initialized state 
    CROSSINGZONE_OCCUPIED, // train detected by the entry sensor 
    CROSSINGZONE_EXITING // train detected by the exit sensor, when sensor clears, state = CLEAR 
}; 

В C# я бы назвал мое перечисление и указать значения:

public enum CommodityIndexSector 
{ 
    Currency = 1, 
    StockIndex = 2, 
    GovernmentBond = 3, 
    Metals = 4, 
    Energy = 5, 
    Grains = 6, 
    Softs = 7, 
    Meats = 8, 
    Other = 9 
} 

и я хотел бы получить доступ к это нравится так .... enumname.enumvalue. Я не уверен, что класс выглядит правильно.

+1

Может быть, вы забыли имя перечисления? :) –

+0

enum class CommodityIndexSector {...}; – Exceptyon

ответ

2

В значениях C++ enum отображаются в их внешней области. Если у вас есть

enum { 
    CROSSINGZONE_CLEAR, // no train in crossing area, also initialized state 
    CROSSINGZONE_OCCUPIED, // train detected by the entry sensor 
    CROSSINGZONE_EXITING // train detected by the exit sensor, when sensor clears, state = CLEAR 
}; 

в значительной степени эквивалентно иметь #define значения.

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

enum CrossingZones { 
    // ^^^^^^^^^^^^^ 
    CROSSINGZONE_CLEAR, // no train in crossing area, also initialized state 
    CROSSINGZONE_OCCUPIED, // train detected by the entry sensor 
    CROSSINGZONE_EXITING // train detected by the exit sensor, when sensor clears, state = CLEAR 
}; 

и вы можете ссылаться на конкретный тип перечисления:

CrossingZones crossingZones = CROSSINGZONE_CLEAR; 

более интуитивное заявление относительно значений , должен иметь класс перечисления для текущего стандарта:

enum class CrossingZones { 
    // ^^^^^ 
    CROSSINGZONE_CLEAR, // no train in crossing area, also initialized state 
    CROSSINGZONE_OCCUPIED, // train detected by the entry sensor 
    CROSSINGZONE_EXITING // train detected by the exit sensor, when sensor clears, state = CLEAR 
}; 

и использовать их из сферы действия:

CrossingZones crossingZones = CrossingZones::CROSSINGZONE_CLEAR; 
          // ^^^^^^^^^^^^^^^ 
+0

и использовать так в инструкции switch? case CrossingZones :: CROSSINGZONE_OCCUPIED ....... – dinotom

+0

@dinotom Любые особые проблемы? –

+0

нет, просто подтверждал синтаксис, так как Im a C# guy – dinotom

0

В C++ 11 теперь вы можете использовать enum class, и вы также можете указать значения для него. Однако вам понадобится бросок, чтобы вернуть значение.

enum class Crossing_zone { 
    clear = 0, 
    occupied = 2, 
    exiting = 1 
}; 

int main() 
{ 
    auto myenumvar = Crossing_zone::occupied; 
    return 0; 
} 
-1

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

typedef enum { 
    CROSSINGZONE_CLEAR, // no train in crossing area, also initialized state 
    CROSSINGZONE_OCCUPIED, // train detected by the entry sensor 
    CROSSINGZONE_EXITING // train detected by the exit sensor 
} EnumName; 

абд затем доступ к его значениям через следующий код:

EnumName::CROSSINGZONE_OCCUPIED 
+1

Это стиль c. Не рекомендуется для C++. –

+0

Почему это не рекомендуется? Каковы проблемы с этим? –