0

我目前有一个基类Expr和一些派生类,例如AddExpr,MultExprNumExpr. 我正在尝试重载一个通用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;
};
4

2 回答 2

4

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

于 2012-05-28T17:43:47.860 回答
2

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

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

  2. 它没有在leftand之间放置任何空格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();
}
于 2012-05-28T17:44:23.310 回答