gpt4 book ai didi

C++ - 好的还是坏的做法?

转载 作者:太空狗 更新时间:2023-10-29 23:27:57 25 4
gpt4 key购买 nike

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

例如:

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++ - 好的还是坏的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21904235/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com