3

在 C 中,我可以使用 if/else 语句测试枚举的值。例如:

enum Sport {Soccer, Basket};


Sport theSport = Basket;

if(theSport == Soccer)
{
   // Do something knowing that it is Soccer
}
else if(theSport == Basket)
{
   // Do something knowing that it is Basket
}

有没有另一种方法可以用 C++ 完成这项工作?

4

3 回答 3

8

是的,您可以使用虚函数作为接口的一部分,而不是使用 if-else 语句。

我给你举个例子:

class Sport
{
public:
    virtual void ParseSport() = 0;
};

class Soccer : public Sport
{
public: 
    void ParseSport();
}

class Basket : public Sport
{
public:
    void ParseSport();
}

并以这种方式使用您的对象后:

int main ()
{
    Sport *sport_ptr = new Basket();

    // This will invoke the Basket method (based on the object type..)
    sport_ptr->ParseSport();
}

这要归功于 C++ 添加了面向对象的特性。

于 2012-05-31T13:30:01.390 回答
5

你可以

1 在编译时使用模板魔法对不同的和不相关的类型执行不同的动作;

2 在运行时使用继承和多态对继承相关的类型执行不同的操作(如 gliderkite 和 rolandXu 的答案);

3 对(或其他整数类型)使用 C 风格的switch语句。enum

编辑:(非常简单)使用模板的示例:

/// class template to be specialised
template<typename> struct __Action;
template<> struct __Action<Soccer> { /// specialisation for Soccer
  static void operator()(const Soccer*);
};
template<> struct __Action<Badminton> { /// specialisation for Badminton
  static void operator()(const Badminton*);
};

/// function template calling class template static member
template<typename Sport> void Action(const Sport*sport)
{
   __Action()(sport);
}
于 2012-05-31T13:35:43.207 回答
2

您仍在测试 C 中的值,即枚举值,而不是 theSport 的类型。C++ 支持运行时类型检查,称为RTTI

于 2012-05-31T13:36:36.760 回答