我有一个递归类Expression
,它表示类似布尔的表达式,例如:
(a & b) | (c & ~d)
请注意,Expression
它同时处理一元和二元表达式。基本上,Expression
应该遵循类似于布尔表达式的CFG。
我以这种方式设计了课程:
class Expression {
public:
Expression() = default;
Expression(unique_ptr<Expression> lhs, unique_ptr<Expression> rhs,
unique_ptr<IBinaryOperator> binop, unique_ptr<IUnaryOperator> unop);
Expression operator^(Expression& that);
Expression operator%(Expression& that);
Expression operator|(Expression& that);
Expression operator*(Expression& that);
Expression operator+(Expression& that);
Expression operator&(Expression& that);
Expression operator>>(Expression& that);
Expression operator!();
Expression operator~();
double Evaluate(double x);
virtual ~Expression();
protected:
unique_ptr<Expression> _lhs = nullptr;
unique_ptr<Expression> _rhs = nullptr;
unique_ptr<IBinaryOperator> _binop = nullptr;
unique_ptr<IUnaryOperator> _unop = nullptr;
};
构造函数的实现以及二元和一元运算符各一个如下所示:
Expression::Expression(unique_ptr<Expression> lhs, unique_ptr<Expression> rhs, unique_ptr<IBinaryOperator> binop, unique_ptr<IUnaryOperator> unop) :
_lhs(move(lhs)), _rhs(move(rhs)), _binop(move(binop)), _unop(move(unop)) {
}
Expression Expression::operator+(Expression&& that) {
return Expression(unique_ptr<Expression>(this), unique_ptr<Expression>(&that), unique_ptr<IBinaryOperator>(new SumCoNorm), nullptr);
}
Expression Expression::operator~() {
return Expression(nullptr, unique_ptr<Expression>(this), nullptr, unique_ptr<IUnaryOperator>(new Intensify));
}
该类无法编译
error: use of deleted function 'Fuzzy::Expression::Expression(const Fuzzy::Expression&)'
在每个重载的运算符中(在 return 语句中)。我觉得某些函数在内部尝试使用不存在的 unique_ptr 的复制构造函数。我在这里和那里移动指针有什么问题吗?我将 C++11 与 GCCv4.8 一起使用。
欢迎以任何方式对类接口的更改提出建议。我宁愿避免使用原始指针。
注意:请不要建议使用解析器生成器或类似的东西,例如 Boost.Spirit、YARD 或 YACC。该应用程序要求我从头开始实现它。