これは宿題に関する質問です。基本的に私は科学計算機を実現しなければなりません。基本クラスポインタからの変換コンストラクタ
リテラルを表すコード/階層を簡素化することを仮定します。あなたが見ることができるように
struct Literal {
virtual std::string toString() const = 0;
};
struct NumericLiteral : public Literal {};
struct IntegerLiteral : public NumericLiteral {
int value;
IntegerLiteral(int value) : value(value) {}
std::string toString() const override { return std::to_string(value); }
};
struct RationalLiteral : public NumericLiteral {
int num, den;
RationalLiteral(int den, int num) : num(num), den(den) {}
RationalLiteral(IntegerLiteral il) : num(il.value), den(1) {}
std::string toString() const override { return std::to_string(num) + '/' + std::to_string(den); }
};
struct RealLiteral : public NumericLiteral {
double value;
RealLiteral(double value) : value(value) {}
RealLiteral(IntegerLiteral il) : value(il.value) {}
RealLiteral(RationalLiteral rl) : value(rl.num/(double)rl.den) {}
std::string toString() const override { return std::to_string(value); }
};
struct ExpressionLiteral : public Literal {
std::string expr;
ExpressionLiteral() {}
ExpressionLiteral(std::string expr) : expr(expr) {}
ExpressionLiteral(IntegerLiteral nl) : expr(nl.toString()) {}
ExpressionLiteral(RationalLiteral rl) : expr(rl.toString()) {}
ExpressionLiteral(RealLiteral rl) : expr(rl.toString()) {}
std::string toString() const override { return expr; }
};
、より一般的なリテラルに以下の一般的なリテラルからの変換コンストラクタがあり、例えば実数への整数。いくつかの時点で
は、私はタイプLiteral *
のオペランドにアリティNのオペレータを適用する必要があります、と私はより一般的な(ExpressionLiteral > RealLiteral [...] > IntegerLiteral
)に基づいてコンクリートリテラルのベクトルを取得する必要があります。 args
がstd::vector<Literal*>
ある
std::vector<ExpressionLiteral> v;
for (auto op : args) v.push_back(ExpressionLiteral(*op));
:
は、だから私はこのような何か(ExpressionLiteral
ための一例)を試してみました。
ExpressionLiteral
にはLiteral
の変換コンストラクタがないため、これは失敗しました。
実際のタイプのLiteral
に対応する変換コンストラクタをどのように呼び出すことができますか?
ありがとうございます。
仮想クローン機能を実装していますか? – NathanOliver
'ExpressionLiteral'のポイントは何ですか? 'v.push_back(op-> toString())'がほしいと思うようですね。 – Barry
子コンストラクタで親コンストラクタを初期化してみてください。 ExpressionLiteral():Literal(){} – Striker