Sim*_*low 5 c++ inheritance class unions
我有一个问题,我被困在哪种方法比另一方更好:
具有枚举的结构,用于定义union成员中的数据或具有继承的一组类
示例代码如下:
基于联盟的结构
typedef union TokenValue{
bool bValue;
long lvalue;
double dvalue;
std::string svalue;
}
class Token{
public:
TokenType type;
TokenValue value;
};
Run Code Online (Sandbox Code Playgroud)
类继承
class TokenBase{
public:
TokenType type;
};
class TokenNumber: public TokenBase{
public:
bool isInt;
long lvalue;
double dvalue;
};
class TokenString: public TokenBase{
public:
std::string svalue;
};
Run Code Online (Sandbox Code Playgroud)
这种类型的设计被称为有区别的联合或标记联合。您可以在 Google 上搜索“C++ 可区分联合”以查看此类设计的几个示例和方法。
union对于 C++,AC通常被认为有点低级和不安全。正如皮特贝克尔所说,union基于您的解决方案应该提供访问器,而不是直接暴露不安全的union成员。 unions 还有一个缺点,在 C++11 之前,它们不能包含非 POD 数据结构(所以没有std::string)。
基于继承的解决方案的优点是您可以开始使用多态(例如,添加虚拟PrintTo方法)。(当然,您可以通过向执行overPrintTo的union基于解决方案添加方法来实现类似的结果,但这不是面向对象的。)switchTokenType
一个union基础的解决方案可能会体重轻于基于继承的解决方案(无vtable)。对于像词法分析器标记这样低级的东西,这可能更可取。
如果允许使用第三方库,我强烈建议您查看Boost.Variant以获取更多 C++ 方法来区分联合。