簡體   English   中英

C ++遞歸指針函數調用

[英]C++ recursive pointer function calls

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

所以最終我希望通過遞歸調用print()函數,如果左右兩個指針是數字,(表達式+數字),(表達式+表達式)等,則add表達式可以打印出(數字+數字)。

但是我不認為我正在正確處理這個問題,因為我得到的是混亂的輸出:(我不太熟悉通過指針傳遞和通過引用傳遞,但是我經歷過類似問題的每篇文章都與我的情況。

這是用於調用函數的調試示例:

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

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

我發現您的AddExpr :: print()方法存在兩個問題:

  1. 它實際上不返回任何東西。 為此,您至少應該得到一個編譯器警告,即使不是錯誤。

  2. 它不把之間的任何空間, leftright

嘗試這個:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM