В настоящее время у меня есть базовый класс 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;
};