gpt4 book ai didi

c++ - 为什么我们在解析器文件中定义 union 时使用复杂类的指针?

转载 作者:太空宇宙 更新时间:2023-11-04 16:03:52 25 4
gpt4 key购买 nike

我正在为 RDDL 开发解析器而且,正如我之前所做的那样,当我定义包含我使用的类型的 union 时,我使用指针。例如

%union {
double d;
int i;
std::string *str;
std::vector<std::string> *vectorStr;

RDDLBlock *rddlBlock;
Domain *domain;
DefineType *defineType;
std::vector<DefineType*> *vectorDefineType;
DomainList *domainList;
std::vector<PvarDefinition*> *vectorPvarDefinition;
PvarDefinition *pVarDefinition;
CpfDefinition *cpfDefinition;
std::vector<CpfDefinition*> *vectorCpfDefinition;
PvarExpression *pVarExpression;
LogicalExpression *logicalExpression;
std::vector<LogicalExpression*> *vectorLogicalExpression;
LConstCaseList *lConstCaseList;
CaseDefine *caseDefine;
std::vector<CaseDefine*> *vectorCaseList;
Parameter *parameter;
ParameterList *parameterList;

ObjectDefine *objectDefine;
std::vector<ObjectDefine*> *objectsList;
PvariablesInstanceDefine* pvariablesInstanceDefine;
std::vector<PvariablesInstanceDefine*> *pvariablesInstanceList;

Instance *instance;
NonFluentBlock *nonFluentBlock;
}

这是我看到大多数人在解析器中实现多种标记类型的方式。在网上搜索这个答案时,我看到的只是示例,没有解释为什么我们必须使用指针。我现在的任务之一是尽可能地“清理指针”。所以我的问题是,在这种情况下,为什么我们(必须)在 union 中使用指针?

编辑:添加了 union 中定义的完整类型列表。

最佳答案

您不必使用指针。如您所见,doubleint 都不是指针。

至于“我们为什么使用”部分,我们应该记住 union 的一些属性。

  1. sizeof union_t 必须至少与最大成员一样大。因此,您不希望与单个单词 int 和一些 1KB 类按值合并。指针几乎总是有固定的小尺寸。

  2. 在 C++ 世界中,许多类(例如,std::stringstd::vector)都有重要的复制构造函数和析构函数。

对于这样的类,将它们放在 union 中是不安全的。 C++11 对此提供了一个“解决方案”,称为 unrestricted unions .但即便如此,它也不会按原样工作:对于 union_t 对象 的每次赋值和销毁,您都必须显式销毁/构造一个事件的 union 成员。

关于c++ - 为什么我们在解析器文件中定义 union 时使用复杂类的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38716699/

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