我有一個使用訪問者模式的抽象語法樹類。所有建構式和訪問函式都接受對抽象節點'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 root, left, right,因為它當然是抽象的。當我添加'&'到定義時,它說variables 'root' requires initializer. 我嘗試在這個函式中使用指標來解決這個問題,但它確實做到了,但是,如果根的每個子節點都是指向 ASTNode 的指標,則現有樹將無法使用它,因為它需要參考。那么有沒有辦法讓這個函式在沒有指標的情況下作業呢?:
此函式的目標是僅將根節點回傳給呼叫類,然后呼叫類應該能夠對其子節點進行操作:
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;
}
uj5u.com熱心網友回復:
由于 ASTNode 是純虛擬的,您不能構造它的實體,而且由于切片,在處理多型型別時不應該使用值語意。
其次,在所示示例中,您回傳了對區域變數的參考。
您應該使用指標(如您所提到的)并在堆上構建樹。或者您通過參考將根節點傳遞給函式:
void TreeBuilder::buildTree(ASTNode& root, std::string expression){
//generates tree from tokens
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/537265.html
標籤:C 指针参考参考传递
上一篇:在C中使用指標時,我總是出錯
