我目前有一个基类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;
};