我目前有一个基类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;
}
所以最终我希望add表达式打印出一个(数字+数字),如果左右指针是数字,(表达式+数字),(表达式+表达式)等,通过递归调用{{1}功能。
然而,我不认为我正在接近这个,因为我得到混乱的输出:( 我不太熟悉指针传递并通过引用传递,但是我所遇到的类似问题的帖子与我的情况并不完全相关。
这是调用函数的调试示例:
print()
这将打印出1和2但在AddExpr上有问题。
感谢任何帮助!
编辑: 我的表达式类的标题:
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;
答案 0 :(得分:4)
AddExpr :: print()不返回任何值。
答案 1 :(得分:2)
我发现您的AddExpr :: print()方法存在两个问题:
它实际上并没有返回任何内容。你应该至少得到一个编译器警告,如果不是错误的话。
left
和right
之间没有任何空格。
试试这个:
string AddExpr::print() {
string s;
stringstream out;
out << "(+" << left->print() << " " << right->print() << ")";
s = out.str();
return s;
}
实际上,最好是执行以下操作 - 无需创建显式字符串变量:
string AddExpr::print() {
stringstream out;
out << "(+" << left->print() << " " << right->print() << ")";
return out.str();
}