0

現在、基本クラスExprと、、、などの派生物AddExprMultExprあり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;
};
4

2 に答える 2

4

AddExpr :: print()は値を返しません。

于 2012-05-28T17:43:47.860 に答える
2

AddExpr :: print()メソッドに2つの問題があります。

  1. 実際には何も返されません。これについては、エラーではないにしても、少なくともコンパイラの警告が表示されているはずです。

  2. 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();
}
于 2012-05-28T17:44:23.310 に答える