【发布时间】:2014-02-20 09:57:12
【问题描述】:
我正面临这样的情况,我发现将对象的类型(作为枚举)存储在基类中以进一步将指向该基类的指针转换为子类指针,这取决于它的值。输入。
例如:
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;
}
}
这是一种不好的做法吗?
谢谢你:)
编辑:
假设我正在分析我的令牌列表。在某些时候,我会想检查当前令牌是否是使用虚拟函数virtual bool isOperator() 的运算符,正如人们所建议的那样。
现在,如果它是一个运算符,我将想要访问该子类特定的东西以找出例如它是哪种类型的运算符。在这种情况下,我该怎么办?我无法在我的基类中添加方法 getOperatorType(),这没有任何意义。除了转换为子类来检索该子类成员值之外,还有其他方法吗?
【问题讨论】:
-
它通常表明你有一个有缺陷的设计,如果你需要沮丧的话。但是,C++ 有一个内置的方法可以让你做到这一点,使用
dynamic_cast。 -
您是否有可用的运行时类型信息 (RTTI)?如果是这样,为什么不使用多态机制。
标签: c++ object casting polymorphism introspection