在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+中为解释器使用访问者模式+; 我在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

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 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,似乎与此相关。