这是与家庭作业有关的问题。基本上我必须要实现一个科学计算器。
假设代表文字的简化代码/层次结构:
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 *
类型的操作数上应用arity n 运算符,我需要得到一个具体<的向量/ strong>基于更一般的文字(ExpressionLiteral > RealLiteral [...] > IntegerLiteral
)。
所以我试过这样的事情(ExpressionLiteral
的例子):
std::vector<ExpressionLiteral> v;
for (auto op : args) v.push_back(ExpressionLiteral(*op));
其中args
为std::vector<Literal*>
。
这是不成功的,因为ExpressionLiteral
没有Literal
的转换构造函数。
如何调用与Literal
指向的实际类型对应的转换构造函数?
谢谢你提前。
答案 0 :(得分:1)
您需要一种方法让Literal
将自身转换为ExpressionLiteral
,其转化取决于Literal
的runtype类型。这就是virtual
函数的用途:
struct Literal {
virtual ExpressionLiteral asExpression() const = 0;
};