gpt4 book ai didi

C++, union 与类继承

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:16:19 26 4
gpt4 key购买 nike

我有一个特定的问题,我被困在哪种方法比另一种更好:

具有枚举的结构,定义 union 成员中的数据 OR一组具有继承性的类

示例代码如下:

基于 union 的结构

  typedef union TokenValue{
bool bValue;
long lvalue;
double dvalue;
std::string svalue;
}

class Token{
public:
TokenType type;
TokenValue value;
};

类继承

class TokenBase{
public:
TokenType type;
};



class TokenNumber: public TokenBase{
public:
bool isInt;
long lvalue;
double dvalue;
};

class TokenString: public TokenBase{
public:
std::string svalue;
};

最佳答案

这种类型的设计被称为 discriminated union or tagged union .您可以在 Google 上搜索“C++ discriminated union”,以查看此类设计的多个示例和方法。

C union 通常被认为对 C++ 来说有点低级和不安全。作为Pete Becker said ,您基于 union 的解决方案应该提供访问器,而不是直接公开不安全的 union 成员。 union 也有缺点,在 C++11 之前,它们不能包含非 POD 数据结构(因此没有 std::string)。

基于继承的解决方案的优点是您可以开始使用多态性(例如,添加虚拟 PrintTo 方法)。 (当然,您可以通过将 PrintTo 方法添加到基于 union 的解决方案来实现类似的结果,该解决方案在 上执行 switch TokenType,但那不是面向对象的。)

基于 union 的解决方案可能比基于继承的解决方案(无 vtable)更轻量级。对于像词法分析器标记这样低级的东西,这可能更可取。

如果允许使用第三方库,我强烈建议您查看 Boost.Variant获取更多 C++ 方法来区分 union 。

关于C++, union 与类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12094694/

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