2009-08-01

しばらくはまったこと

be into ではなく、troubleの意味で・・・

最近何を思ったのかC++でちょっとしたものを作ってみたりしているのだが、それではまった。
はまったコード

class x
{
public:
typedef std::vector< x* > x_list;
x_list children() { return children_; }
void append(x* child()) { children().push_back(child); }
private:
x_list children_;
};

void do_something(x* parent, x* child)
{
x->append(child);
}

Java的感覚で見ると特に問題ないのだけど、C++的には意図した動作をしない。ある意味当たり前なんだけど、しばらくC++から離れていたのではまった・・・
問題h、メンバ関数children()が参照返しではなく値返しだということ。っで、append()の中でchildren()を呼び出しているので、children_に追加したくても、実際にはどこかにメモリーをリークさせながら消えていったという悲しい現実。
わざわざappend()の中でchildren()を呼ぶ必要があったかと言われると・・・
解決方法は簡単でchildren()の戻り値を「x_list&」にすればOK。

今後の備忘録のために、恥ずかしいミスをさらしておく・・・orz

No comments:

Post a Comment