2010-01-15 38 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; 
}