Вызов функции рекурсивного указателя C++

В настоящее время у меня есть базовый класс Exprи некоторые производные, такие как AddExpr, MultExprи NumExpr. Я пытаюсь перегрузить общую функцию print(), которая рекурсивно вызывает функцию print()своих членов, которые являются указателями на другие объекты Expr.

//Addition Expression
AddExpr::AddExpr( Expr* l, Expr* r ) {
    left = l;
    right = r;
}
string AddExpr::print() {
    string s;
    stringstream out;
    out << "(+" << left->print() << right->print() << ")";
    s = out.str();
}

NumExpr::NumExpr( string n ) {
    number = atoi( n.c_str() );
}
string NumExpr::print() {
    string s;
    stringstream out;
    out << number;
    s = out.str();
    return s;
}

Итак, в конечном итоге я хочу, чтобы выражение добавления выводило (число + число), если левый и правый указатели являются числами, (выражение + число), (выражение + выражение) и т. д., рекурсивно вызывая print ()функция.

Однако я не думаю, что подхожу к этому правильно, поскольку я получаю беспорядочный вывод :( Я не слишком хорошо знаком с передачей по указателю и передачей по ссылке, однако каждый пост, который я прошел с подобным вопросом, не совсем соответствует моей ситуации.

Вот пример отладки для вызова функций:

NumExpr* left = new NumExpr("1");
cout << left->print() << endl;
NumExpr* right = new NumExpr("2");
cout << right->print() << endl;
AddExpr* temp = new AddExpr( left, right );
cout << temp->print() << endl;
Expr* temp2 = temp;
cout << temp2->print() << endl; 

Будет напечатано 1 и 2, но есть проблема с AddExpr.

Будем признательны за любую помощь!

РЕДАКТИРОВАТЬ: заголовок для моих классов выражений:

class Expr {
    public:
        virtual string name();
        virtual string print();
};

class AddExpr : public Expr {
    public:
        AddExpr(Expr* l, Expr* r);
        string print();
    private:
        Expr* left;
        Expr* right;
};

class NumExpr : public Expr {
    public:
        NumExpr( string v );
        string print();
    private:
        int number;
};
0
задан Jason Hu 28 May 2012 в 17:39
поделиться