gpt4 book ai didi

c++ - 在 C++ 中使用访问者模式作为解释器

转载 作者:搜寻专家 更新时间:2023-10-31 02:00:25 25 4
gpt4 key购买 nike

我在为 C++ 中的解释器应用访问者模式时遇到了问题。以下代码根据需要生成 (+) 而不是 ((1+2)+3):

class ExpVisitor{
public:
virtual void visit(class Add*)=0;
virtual void visit(class Int*)=0;
};

class Exp{
public:
virtual void accept(ExpVisitor *v){};
};

class Add : public Exp{
public:
Exp e1,e2;
Add(Exp in1,Exp in2){
e1=in1;
e2=in2;
}
void accept(ExpVisitor *v){
v->visit(this);
}
};

class Int : public Exp{
public:
int val;
Int(int v){
val=v;
}
void accept(ExpVisitor *v){
v->visit(this);
}
};

class PrintExp : public ExpVisitor{
public:
void visit(Add *e){
cout << '(';
(e->e1).accept(this);
cout << '+';
(e->e2).accept(this);
cout << ')';
}
void visit(Int *e){
cout << e->val;
}
};


int main(){
Add e=Add(Add(Int(1),Int(2)),Int(3));
PrintExp p;
e.accept(&p);
cout << endl;
}

当然,问题是 Exp::accept 被调用而不是从 Add 或 Int 调用。但是,我不能使 accept 成为纯虚拟的,因为 Add 拥有两个类型为 Exp 的成员 e1 和 e2。我该如何修正这个例子?

最佳答案

您需要使 Add 中的字段指向 Exp 的实例。然后你可以使 accept 方法成为虚拟的。当然,您必须管理内存。最简单的方法是使用智能指针。

关于c++ - 在 C++ 中使用访问者模式作为解释器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2074448/

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