我遇到的情况是,我很方便在基类中存储对象的类型(作为枚举),以便根据该类型的值将指向该基类的指针进一步转换为子类指针。

例如 :

class CToken
{
public:
   token_type_e eType;
};

class COperatorToken : public CToken
{
public:
    // Sub class specific stuff
};

class CLiteralToken : public CToken
{
public:
    // Sub class specific stuff
};

然后
vector<CToken *> aTokens;

//...

for( size_t nI = 0, nMaxI = aTokens.size(); nI < nMaxI; ++nI )
{
   switch( aTokens[ nI ]->eType )
   {
   case E_OPERATOR :
      // Do something with sub-class specific stuff.
      break;
   case E_LITERAL :
      // Do something with sub-class specific stuff.
      break;
   }
}

这是不好的做法吗?

谢谢 :)

编辑:

假设我正在分析我的 token 列表。在某些时候,我想检查一下当前 token 是否是使用虚拟函数virtual bool isOperator()的运算符,正如人们所建议的那样。
现在,如果它是一个运算符,我将要访问该子类特定的东西以找出例如它是哪种运算符。在这种情况下,我该怎么办?我无法在基类中添加方法getOperatorType(),这毫无意义。除了强制转换为子类以检索该子类成员值之外,还有其他方法吗?

最佳答案

类型字段确实击败了C++的面向对象性质。通常,您可以使用多态来解决此问题:

CToken中,定义一个函数virtual doSomething(),并带有适当的参数和返回类型。

COperatorTokenCLiteralToken中实现该功能。

如果您随后使用aTokens[ nI ]->doSomething();,则运行时将调用适当的函数

关于c++ - C++-好的还是不好的做法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21904235/

10-12 18:37