0じゃだめだろ人として でおっきなチョンボ。
// らめえええぇぇ!!
int binary_node::sum() {
return value + left->sum() + right->sum();
}
バグですごめんなさい。
left, right に差し込まれた null() に対してsum() が呼ばれ、
無間地獄に堕ち込みます。
仕切り直し。
// 基底クラス
class node {
public:
virtual int sum() const =0;
};
// 二分木の節
class binary_node : public node {
public:
node* left; // 左の枝
node* right; // 右の枝
int value;
// デストラクタ: null()捨てちゃらめえぇぇ!
~binary_node() {
if ( left != null() ) delete left;
if ( right != null() ) delete right;
}
// 一族の総和
int sum() const { return value + left->sum() + right->sum(); }
// non-heapなインスタンスは許さないわ!
static binary_node* create(int v) { return new binary_node(v); }
private:
// コンストラクタ: 使わぬ枝はnull()
binary_node(int v) : value(v) {
left = null(); right = null();
}
// nullオブジェクト
class null_node : public node {
virtual int sum() const { return 0; }
};
static node* null() {
static null_node dummy;
return &dummy;
}
};
#include <iostream>
int main() {
binary_node* root = binary_node::create(1);
root->left = binary_node::create(2);
root->right = binary_node::create(3);
std::cout << root->sum();
delete root;
}
えらくややこしくなりました。
sum()のためダケにこーゆーマネしたんだからしゃーないですが。