[英]C++ recursive pointer function calls
我目前有一個基類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;
}
所以最終我希望通過遞歸調用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()方法存在兩個問題:
它實際上不返回任何東西。 為此,您至少應該得到一個編譯器警告,即使不是錯誤。
它不把之間的任何空間, 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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.