提问人:callum arul 提问时间:11/17/2022 最后编辑:callum arul 更新时间:11/17/2022 访问量:118
传递对抽象类对象的引用
Passing a reference to an abstract class object
问:
我有一个使用访问者模式的抽象语法树类。所有构造函数和 visit 函数都接受对抽象节点或其派生类的引用。'ASTNode'
class ASTNode {
public:
virtual void accept(ASTVisitor& visitor) = 0;
};
class NameNode : public ASTNode {
public:
NameNode(std::string name) : name(name) { }
void accept(ASTVisitor& visitor) override;
std::string name;
};
class ListNode : public ASTNode {
public:
ListNode(ElementSptr list) : list(list) { }
void accept(ASTVisitor& visitor) override;
ElementSptr list;
};
class BinaryOperator : public ASTNode {
public:
BinaryOperator(std::string kind, ASTNode& left, ASTNode& right)
: kind(kind), left(left), right(right) { }
void accept(ASTVisitor& visitor) override;
std::string kind;
ASTNode& left;
ASTNode& right;
};
class ASTVisitor {
public:
virtual void visit(ASTNode& node) = 0;
virtual void visit(NameNode& name) = 0;
virtual void visit(ListNode& list) = 0;
virtual void visit(BinaryOperator& bOp) = 0;
virtual void visit(UnaryOperator& uOp) = 0;
};
我有一个单独的类来构建实际的树,这是执行它的函数。但问题是,我无法创造,因为它当然是抽象的。当我添加到定义中时,它说 .我尝试在此函数中使用指针来解决这个问题,但是,如果根的每个子项都是指向 ASTNode 的指针,则现有树将无法使用它,因为它会接受引用。那么,有没有办法让这个函数在没有指针的情况下工作呢?:ASTNode root, left, right
'&'
variables 'root' requires initializer
此函数的目标是仅将根节点返回给调用类,然后调用类应该能够对其子类执行操作:
ASTNode& TreeBuilder::buildTree(std::string expression){
std::vector<std::string> tokens = split(expression);
std::deque<ASTNode&> nodeStack;;
std::deque<std::string> operatorStack;
ASTNode root;
ASTNode& left;
ASTNode& right;
//generates tree from tokens
return root;
}
答:
1赞
Hein Breukers
11/17/2022
#1
由于 ASTNode 是纯虚拟的,因此您无法构造它的实例,此外,由于切片,在处理多态类型时不应使用值语义。
其次,在所示示例中,您返回对局部变量的引用。
您应该使用指针(如您所提到的)并在堆上构造树。或者,通过引用将根节点传递给函数:
void TreeBuilder::buildTree(ASTNode& root, std::string expression){
//generates tree from tokens
}
评论