2011-01-09 4 views
3

Возможно ли передать значение и константу enum базовому конструктору класса?C++ Call base constructor с enum

Например:

enum CarBrand 
{ 
    Volkswagen, 
    Ferrari, 
    Bugatti 
}; 

class Car 
{ 
    public: 
     Car(int horsePower, CarBrand brand) 
     { 
      this->horsePower = horsePower; 
      this->brand = brand; 
     } 
     ~Car() { } 
    private: 
     int horsePower; 
     CarBrand brand; 
}; 

class FerrariCar : public Car 
{ 
    public: 
     // Why am I not allowed to do this ..? 
     FerrariCar(int horsePower) : Car(horsePower, CarBrand.Ferrari) { } 
     ~FerrariCar(); 
}; 

Потому что я получаю следующее сообщение об ошибке при компиляции что-то вдоль линий, например: expected primary-expression before ‘.’ token

Любая помощь будет оценен по достоинству!

+0

Только быстрое примечание - ваш 'Класс FerrariCar' имеет в верхнем регистре «Класс» - он должен быть «классом». –

+0

Возможно, также захотите использовать списки инициализации конструктора вместо назначения в теле – David

ответ

10

В C++ вы не префикс значения перечисления с именем типа перечисления. Просто скажите Ferrari.

+0

Спасибо, это работает! – Kevin

4

C перечисления ++ расширить свои ценности в окружающей сферу - так что в этом случае вы можете просто сказать

FerrariCar(int horsePower) : Car(horsePower, Ferrari) { } 

C++ 0x приносит новые классы перечислений, которые ведут себя как Java перечисления, так что вы могли бы написать:

enum class CarBrand { 
    Volkswagen, 
    Ferrari, 
    Bugatti 
}; 

, а затем использовать значения как CarBrand::Ferrari.

+0

C++ 0x отлично звучит :), я, наверное, должен почитать об этом. – Kevin

0

Из документов - ISO/IEC 14882: 2003 (E), стр 113 - точка 10

имя-перечисление и каждый нумератор объявлен перечисление спецификатора объявляется в объеме, который сразу содержит спецификатор перечисления. Эти имена подчиняются правилам области видимости, определенным для всех имен в [..] и [..]. Перечислитель объявлен в области видимости класса может быть отнесен к использованию операторов доступа к членам класса (::, (точка) и -.> (Стрелка))

class X 
{ 
    public: 
    enum direction { left=’l’, right=’r’ }; 
    int f(int i) 
    { return i==left ? 0 : i==right ? 1 : 2; } 
}; 
void g(X* p) 
{ 
    direction d;  // error: direction not in scope 
    int i; 
    i = p->f(left);  // error: left not in scope 
    i = p->f(X::right); // OK 
    i = p->f(p->left); // OK 
    // ... 
}