2016-05-05 8 views
-1

これは宿題に関する質問です。基本的に私は科学計算機を実現しなければなりません。基本クラスポインタからの変換コンストラクタ

リテラルを表すコード/階層を簡素化することを仮定します。あなたが見ることができるように

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)に基づいてコンクリートリテラルのベクトルを取得する必要があります。 argsstd::vector<Literal*>ある

std::vector<ExpressionLiteral> v; 
for (auto op : args) v.push_back(ExpressionLiteral(*op)); 

は、だから私はこのような何か( ExpressionLiteralための一例)を試してみました。

ExpressionLiteralにはLiteralの変換コンストラクタがないため、これは失敗しました。

実際のタイプのLiteralに対応する変換コンストラクタをどのように呼び出すことができますか?

ありがとうございます。

+0

仮想クローン機能を実装していますか? – NathanOliver

+0

'ExpressionLiteral'のポイントは何ですか? 'v.push_back(op-> toString())'がほしいと思うようですね。 – Barry

+0

子コンストラクタで親コンストラクタを初期化してみてください。 ExpressionLiteral():Literal(){} – Striker

答えて

1

LiteralExpressionLiteralに変換する方法が必要です。その変換は、Literalの実行タイプの種類に依存します。それは何ですか?virtualの機能は次のとおりです。

struct Literal { 
    virtual ExpressionLiteral asExpression() const = 0; 
}; 
関連する問題