2010-01-15 101 views
2

我在使用C++中的解释器访问者模式时遇到问题。下面的代码产生(+),而不是((1 + 2)3),为期望的:在C++中使用访问者模式解释器

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类型的两个成员e1和e2。我该如何解决这个例子?

+0

嗯,http://en.wikipedia.org/wiki/Interpreter_pattern似乎在这里相关。 – 2010-01-15 22:01:23

回答

3

您需要将添加指针的字段设置为Exp的实例。然后,您可以使接受方法变为虚拟。当然你必须管理内存。最简单的就是使用智能ptrs。

0

中有添加(试验IN1,指数平方英寸)多了一个问题 - IN1,IN2 768,16是帮助引用或指针(除了什么MPG说)

0

感谢。作为参考,工作代码是

#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; 
}