C ++使用枚举调用基础构造函数

时间:2011-01-09 15:03:54

标签: c++ inheritance constructor

是否可以将值和常量枚举传递给类的基础构造函数?

例如:

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

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:10)

在C ++中,不要使用枚举类型名称为枚举值添加前缀。只需说Ferrari

答案 1 :(得分:4)

C ++枚举将其值扩展到周围范围 - 所以在这种情况下你可以说

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

C ++ 0x带来了类似Java枚举的新枚举类,所以你可以写:

enum class CarBrand {
   Volkswagen,
   Ferrari,
   Bugatti
};

然后将值用作CarBrand::Ferrari

答案 2 :(得分:0)

来自文档 - ISO / IEC 14882:2003(E),第113页 - 第10点

  

枚举名称和enum-specifier声明的每个枚举器都在立即包含枚举说明符的作用域中声明。这些名称遵循为[..]和[..]中的所有名称定义的范围规则。在类范围中声明的枚举器可以使用类成员访问运算符(::,。(dot)和 - >(箭头))来引用

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
    // ...
}