C++ C++;递归指针函数调用

C++ C++;递归指针函数调用,c++,pointers,pass-by-reference,C++,Pointers,Pass By Reference,我目前有一个基类Expr和一些派生类,如AddExpr,MultExpr和NumExpr。我试图重载一个常规的print()函数,该函数递归调用其成员的print()函数,这些成员是指向其他Expr对象的指针 //Addition Expression AddExpr::AddExpr( Expr* l, Expr* r ) { left = l; right = r; } string AddExpr::print() { string s; stringstr

我目前有一个基类
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;
}
这将打印出1和2,但在加法器上有问题

感谢您的帮助

编辑: my expression类的标题:

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

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

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

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

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

  • 它不会在
    左侧
    右侧
    之间放置任何空格

  • 试试这个:

    string AddExpr::print() {
        string s;
        stringstream out;
        out << "(+" << left->print() << " " << right->print() << ")";
        s = out.str();
        return s;
    }
    
    stringaddexpr::print(){
    字符串s;
    流出来;
    
    out我发现您的AddExpr::print()方法有两个问题:

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

  • 它不会在
    左侧
    右侧
    之间放置任何空格

  • 试试这个:

    string AddExpr::print() {
        string s;
        stringstream out;
        out << "(+" << left->print() << " " << right->print() << ")";
        s = out.str();
        return s;
    }
    
    stringaddexpr::print(){
    字符串s;
    流出来;
    
    请编辑您的问题并添加相关类的完整源代码(
    Expr
    AddExpr
    NumExpr
    )?另外,您的示例的实际输出是什么,您希望得到什么?您忘了在
    AddExpr::print()中返回s;
    请编辑您的问题并添加相关类的完整源代码(
    Expr
    AddExpr
    NumExpr
    )?另外,您的示例的实际输出是什么,您希望得到什么?您忘了在
    AddExpr::print()中返回s;
    谢谢!这就是问题所在,
    print()
    函数现在正在正确输出我的表达式。非常感谢,尽管我希望g++至少会警告我类似的事情this@Jason:是的,但您必须要求它启用警告。我通常使用
    -Wall-Wextra
    (还有
    -Werror
    ,将它们转化为错误,这样就没有人可以忽略它们)。@MikeSeymour谢谢这是一个很棒的技巧,我通常在windows端用visualstudio编写代码,但不幸的是,我目前无法访问它,所以我在linux端通过g++和vim来实现:)不过经验不错。谢谢!这就是问题所在,
    print()
    函数现在正正确输出我的表达式。非常感谢,尽管我希望g++至少会提醒我类似的事情this@Jason:是的,但您必须要求它启用警告。我通常使用
    -Wall-Wextra
    (还有
    -Werror
    ,将它们转化为错误,这样就没有人可以忽略它们)。@MikeSeymour谢谢这是一个很棒的技巧,我通常在windows端用visualstudio编写代码,但不幸的是,我目前无法访问它,所以我在linux端通过g++和vim来实现:)不过体验不错。
    string AddExpr::print() {
        stringstream out;
        out << "(+" << left->print() << " " << right->print() << ")";
        return out.str();
    }