传递对抽象类对象的引用

Passing a reference to an abstract class object

提问人:callum arul 提问时间:11/17/2022 最后编辑:callum arul 更新时间:11/17/2022 访问量:118

问:

我有一个使用访问者模式的抽象语法树类。所有构造函数和 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;


}
C++ 指针 逐个引用

评论

1赞 Eljay 11/17/2022
如果有某种方法可以将指针变量转换为可以作为参数传递给参数的函数,其中参数是引用。
0赞 molbdnilo 11/17/2022
引用成员通常是一个坏主意,你不能有一个引用向量。您是否尝试过使用指针而不是引用来解决问题?
0赞 Lasersköld 11/17/2022
我不明白为什么使用指针应该是一个问题?在带有构建树的示例中,您将返回对本地对象的引用,该对象将在函数退出后被销毁。为什么不直接从函数返回一个unique_ptr呢?您可能应该考虑代码中的所有权。哪个班级负责你的ast。当您希望类拥有这些值时,不应使用引用和原始指针。
0赞 callum arul 11/17/2022
好的,我设法让它与指针一起工作,没错,在这里使用指针肯定更好。

答:

1赞 Hein Breukers 11/17/2022 #1

由于 ASTNode 是纯虚拟的,因此您无法构造它的实例,此外,由于切片,在处理多态类型时不应使用值语义。

其次,在所示示例中,您返回对局部变量的引用。

您应该使用指针(如您所提到的)并在堆上构造树。或者,通过引用将根节点传递给函数:

void TreeBuilder::buildTree(ASTNode& root, std::string expression){
    //generates tree from tokens 
}