【发布时间】:2017-01-01 20:50:27
【问题描述】:
我需要在我的 C++ 程序中表示一个树层次结构(准确地说是 AST)。好的,我多次看到这种结构的例子,但有一件事我还不清楚。请告诉我为什么在 C++ 中使用类而不是结构来进行 AST 如此普遍?例如,考虑以下代码,它表示 AST 的一个节点:
class Comparison {
public:
Node* getLhs() const { return m_lhs; }
Node* getRhs() const { return m_rhs; }
//other stuff
private:
ComparisonOperator m_op;
Node* m_lhs;
Node* m_rhs;
};
(灵感来自https://github.com/clever-lang/clever/blob/master/core/ast.h#L150,但我丢弃了一些不必要的细节) 正如您在此处看到的,我们有两个 getter,它们返回指向私有数据成员的指针,而这些指针甚至不是 const!据我所知,这打破了封装。那么为什么不是 AST 节点的结构(默认情况下所有成员都是公共的)呢?您将如何在 C++ 中实现 AST(我的意思是处理可访问性问题)? 我个人认为结构非常适合此类任务。
我发布了来自任意项目的代码,但您可能会经常看到这种做法(带有 AST 封装破坏方法的类)。
【问题讨论】:
-
我会说这里没有实际答案,而是基于意见的答案。
-
您的问题实际上不是关于 AST,而是在对象中隐藏私有成员是否好。
-
这让我开始抱怨为什么这些吸气剂不好。但我会避免。它非常基于意见。
-
C++ 中
class和struct之间没有显着差异。两者都用于定义类。两者之间的选择纯粹是风格。 -
它可以防止人们将
m_lhs更改为指向另一个节点。
标签: c++ oop abstract-syntax-tree encapsulation getter