在C+中为解释器使用访问者模式+; 我在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; } class expvisor{ 公众: 虚拟无效访问(类添加*)=0; 虚拟无效访问(类Int*)=0; }; 类经验{ 公众: 虚拟无效接受(ExpVisitor*v){}; }; 类添加:公共Exp{ 公众: 实验e1,e2; 添加(Exp in1,Exp in2){ e1=in1; e2=in2; } 无效接受(ExpVisitor*v){ v->参观(本次); } }; 类别Int:public Exp{ 公众: int-val; 整数(整数v){ val=v; } 无效接受(ExpVisitor*v){ v->参观(本次); } }; 类PrintExp:publicExpVisitor{ 公众: 无效访问(添加*e){ 接受(这个); 接受(这个); 您需要将Add pointers中的字段设置为Exp的实例。然后您可以将accept方法设置为虚拟。当然,您必须管理内存。最简单的方法是使用智能ptr。
Add中还有一个问题(Exp in1,Exp in2)-in1,in2应该是引用或指针(除了MPG所说的)谢谢您的帮助。工作代码为在C+中为解释器使用访问者模式+; 我在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; } class expvisor{ 公众: 虚拟无效访问(类添加*)=0; 虚拟无效访问(类Int*)=0; }; 类经验{ 公众: 虚拟无效接受(ExpVisitor*v){}; }; 类添加:公共Exp{ 公众: 实验e1,e2; 添加(Exp in1,Exp in2){ e1=in1; e2=in2; } 无效接受(ExpVisitor*v){ v->参观(本次); } }; 类别Int:public Exp{ 公众: int-val; 整数(整数v){ val=v; } 无效接受(ExpVisitor*v){ v->参观(本次); } }; 类PrintExp:publicExpVisitor{ 公众: 无效访问(添加*e){ 接受(这个); 接受(这个); 您需要将Add pointers中的字段设置为Exp的实例。然后您可以将accept方法设置为虚拟。当然,您必须管理内存。最简单的方法是使用智能ptr。,c++,design-patterns,C++,Design Patterns,Add中还有一个问题(Exp in1,Exp in2)-in1,in2应该是引用或指针(除了MPG所说的)谢谢您的帮助。工作代码为 #include<iostream> using namespace std; class ExpVisitor{ public: virtual void visit(class Add*)=0; virtual void visit(class Int*)=0; }; class Exp{ public: virtual
#include<iostream>
using namespace std;
class ExpVisitor{
public:
virtual void visit(class Add*)=0;
virtual void visit(class Int*)=0;
};
class Exp{
public:
virtual void accept(ExpVisitor *v)=0;
};
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(){
Exp *i1=new Int(1);
Exp *i2=new Int(2);
Exp *i3=new Int(3);
Exp *e1=new Add(i1,i2);
Exp *e2=new Add(e1,i3);
PrintExp p;
e2->accept(&p);
cout << endl;
delete i1,i2,i3,e1,e2;
}
#包括
使用名称空间std;
类expvisor{
公众:
虚拟无效访问(类添加*)=0;
虚拟无效访问(类Int*)=0;
};
类经验{
公众:
虚拟无效接受(ExpVisitor*v)=0;
};
类添加:公共Exp{
公众:
Exp*e1,*e2;
添加(Exp*in1,Exp*in2){
e1=in1;
e2=in2;
}
无效接受(ExpVisitor*v){
v->参观(本次);
}
};
类别Int:public Exp{
公众:
int-val;
整数(整数v){
val=v;
}
无效接受(ExpVisitor*v){
v->参观(本次);
}
};
类PrintExp:publicExpVisitor{
公众:
无效访问(添加*e){
不能e1)->接受(这个);
cout e2)->接受(这个);
不能接受(&p);
cout-Hmm,似乎与此相关。