現在、基本クラス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;
}
したがって、最終的には、関数を再帰的に呼び出すことにより、左右のポインターが数値、(式+数値)、(式+式)などの場合、add式で(数値+数値)を出力する必要があり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;
};