我有一个看起来像这样的令牌类:
class Token
{
public:
typedef enum { STRTOK, INTTOK } Type;
virtual bool IsA(Type) = 0;
}
class IntTok : public Token
{
int data;
public:
bool IsA(Type t) { return (t == INTTOK); }
int GetData() { return data; }
}
IntTok newToken;
if ( newToken.IsA(Token::INTTOK )
{
//blah blah
}
所以基本上我必须在 Token 类中定义每个子类;结果并没有那么糟糕,因为子类很少,我无法想象它们会发生变化。但是,与使用动态转换识别子类相比,它仍然丑陋、笨拙且“正确”。然而:
IntTok newToken;
IntTok* tmpTokenTest = dynamic_cast<IntTok*>(&newToken);
if ( tmpTokenTest != NULL )
{
//blah blah
}
也很笨拙。特别是当我必须将它们串在一个大的嵌套 if 中时。
那你会用哪个?这个问题还有其他解决方案吗?
注意:我知道无论如何我都必须强制他们获取各自的数据,但是
- 在我使用它们的功能之前,我不会施放它们,所以感觉更干净
- 我比使用他们的数据更频繁地测试他们的类型。
注意2:上面代码中没有说明的是这些token也是一个链表。这使得模板变得困难(aToken<int>
可能指向 aToken<string>
等)。这就是为什么我需要一个 Token 类作为父类开始的原因。