私は逆ポーランド記法を使って科学計算機をエミュレートするプロジェクトに取り組んでいます。 "1"、 "1.23"、 "2/3"などの私のlitteralsは、その種類のスタックに格納されています。例えば、 "1"は整数として格納され、 "1.23"はDoubleなどとして、私の型(Double、Integerなどはさまざまな理由で定義されています)を使用して格納されます。私のスタック上のユーザは、+などのオペレータを入力したときに、私は(ポップする必要があります)を2回、操作を実行し、(プッシュ):パラメータに応じて 'new XXXX'を使用する方法はありますか?
私は次のようにやりたいclass Litteral {
public:
virtual QString toString() const = 0;
};
。私はすでに演算子の認識を行っています。ユーザーが+を入力すると、私は与えられたアルゴリズムを実行します。 私の問題は、+が認識され、2つのpop()が実行されたとき、私は実際に+を実行する必要があり、正しいタイプのオブジェクトを作成する必要があるということです。私は2つの整数を持っていた場合でも、私が持っていると思います
Litteral* l = new Double(pop1+pop2);
:
Litteral* l = new Integer(pop1 + pop2);
等... 私は整数とダブルを持っていた場合に例えば は、私が持っていると思います正しい「新しいXXXX()」を実行するために大量の「if」を使うことができましたが、これは良い解決策ではないように感じられます。 私はまた、対応するアルゴリズムを実行するために使用するテンプレートメソッドを使用することについて考えましたが、可能な組み合わせがあるので、この関数の多くのバージョンを作成する必要があります。それでも人間的に可能ですが、やはりきれいに感じません。 これを行うためのきれいな方法はありますか?
おかげ
編集:私は2つの整数をポップするとき例えば は、私は特定の操作を実行したいです。この操作の結果はIntegerでなければなりません。しかし結果は常に整数ではなく、それは私がポップしたものに依存します。それがIntegerとDoubleの場合、結果はDoubleになります。だから私がしなければならない「新しい」タイプは、私がポップしたものに依存します。 そして、私はスイッチ/倍数 'if'でそれを実装したくありません。私はそれを行うにはしたくない:
if ((typeid(*q1) == typeid(Integer)) && (typeid(*q2) == typeid(Double))) { //...}
編集2:
Literal& pop1 = stack.top();
stack.pop();
Literal& pop2 = stack.top();
stack.pop();
Literal& toAdd = (*pop1.clone() + *pop2.clone());
エラー: '演算子+' の不一致(オペランドの型は、 'リテラル' と 'リテラル' であり)
クラス:
class Literal {
public: virtual QString toString() const = 0;
virtual int getValue() const = 0;
virtual Litteral * clone() const = 0;
virtual Litteral& operator+(const Integer& l) = 0;
};
class Integer: public Literal {
friend class LitteralManager;
int value;
public:
Integer(int v) :value(v) {}
Integer(const Entier& e) { value = e.getValue(); };
virtual QString toString() const;
int getValue() const { return value; }
virtual Entier& operator+(const Entier& e);
Entier * clone() const;
};
あなたの例の 'pop1'と' pop2'は 'Double'か' Integer '、そう?もしそうなら、 'operator +'はどのように定義されていますか?適切な型を返すようにすることはできませんし、まったく使用するときに 'new'を使用する必要はありませんか? – sepp2k
* ..整数として、 "1.23"はダブルなどとして*。 * etc *に展開してください。どのくらいの種類の合計がありますか? –
私は7種類のリッタータルを持っています。 – Chuck