【发布时间】:2014-01-20 15:38:12
【问题描述】:
我有一个递归类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&)'
在每个重载的运算符中(在返回语句中)。 我感觉某些函数在内部尝试使用不存在的 unique_ptr 的复制构造函数。我在这里和那里移动指针有什么问题吗?我将 C++11 与 GCCv4.8 一起使用。
欢迎以任何方式对类接口的更改提出建议。我宁愿避免使用原始指针。
注意:请不要建议使用解析器生成器等,例如 Boost.Spirit、YARD 或 YACC。该应用程序需要我从头开始实现。
【问题讨论】:
-
我承认自己生疏了,但我觉得你将构造函数的参数移动到对象的数据成员中似乎很奇怪。
-
没关系;现在我看到这些是本地的
unique_ptr<>s。我希望它们是参考。
标签: c++ c++11 operator-overloading unique-ptr recursive-descent