次のようなトークン クラスがあります。
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:上記のコードでは、これらのトークンがリンクされたリストでもあることは示されていません。これにより、テンプレート化が困難になります( aToken<int>
が a を指す場合Token<string>
など)。これが、最初に親として Token クラスが必要な理由です。