C ++递归指针函数调用

时间:2012-05-28 17:39:38

标签: c++ pointers pass-by-reference

我目前有一个基类Expr和一些衍生品,例如AddExprMultExprNumExpr。我试图重载一个通用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; 

2 个答案:

答案 0 :(得分:4)

AddExpr :: print()不返回任何值。

答案 1 :(得分:2)

我发现您的AddExpr :: print()方法存在两个问题:

  1. 它实际上并没有返回任何内容。你应该至少得到一个编译器警告,如果不是错误的话。

  2. leftright之间没有任何空格。

  3. 试试这个:

    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();
    }