クラス Plus は、クラス Expression を継承します。
class Expression
{
public:
virtual Expression* clone() const = 0;
};
class Plus : public Expression
{
public:
Plus( Expression* lhs, Expression* rhs ) :Expression( lhs, rhs) {};
Plus* clone() const;
};
機能を実装していcopy
ます。clone
のいずれかまたは が失敗した場合、現在の実装ではメモリ リークが発生しPlus
ます。
Plus* Plus::clone() const {
return new Plus(tree_left->clone(), tree_right->clone());
}
そして、このようなものが問題を解決すると思います:
Plus* Plus::clone() const {
Expression *tree_left_clone = nullptr;
Expression *tree_right_clone = nullptr;
Expression *plus_clone = nullptr;
try {
tree_left_clone = tree_left->clone();
tree_right_clone = tree_right->clone()
plus_clone = new Plus( tree_left_clone, tree_right_clone );
} catch (const bad_alloc& e ) {
delete tree_left_clone;
delete tree_right_clone;
delete plus_clone;
}
return plus_clone;
}
しかし、Minus、Times、Divided、Power など、似たような演算子がたくさんありclone
ます。それらすべてを複製する必要があります。このコードを に入れる方法はありExpression
ますか? 私が抱えている問題は、clone
を含む行にありnew Plus
ます。