thisでthis
例えば犬オブジェクトをたくさん作るとして、それを犬マネージャクラスで管理したとする。
犬オブジェクトを色んなところでいっぱい作るんだけど、全部一度に操作したいことがあるかもしれない。皆鳴け、みたいな。
それをしようとすると、犬クラスのコンストラクタで犬マネージャに犬オブジェクトのポインタを渡してほげほげ…
めんどくさくなったのでコード。Bowだと被るのでWan。
import std.c.stdio; class DogManager{ static Dog[] dogs_; static void addDog(Dog dog){ dogs_ ~= dog; } static void decDog(Dog dog){ Dog[] dogs; foreach (Dog d; dogs_){ if (d != dog) dogs ~= d; } dogs_ = dogs; } static void allDogWan(){ foreach (Dog d; dogs_){ d.wan(); } } } class Dog{ char[] name_; this(char[] name){ name_ = name; DogManager.addDog(this); } ~this(){ DogManager.decDog(this); } void wan(){ printf("%.*s < wan!\n", name_); } } void main(){ Dog dog_a = new Dog("hoge"); Dog dog_b = new Dog("hoge"); DogManager.allDogsWan(); delete dog_b; DogManager.allDogsWan(); }
decDogで配列全部なめてるのがダサい、とかは今回はどうでもよくて、Dogコンストラクタの部分。
コンストラクタの中からthisポインタ渡してしまって良いんだろうか…
はじめは「static Dog getInstance(...){ ... }」みたいなのを作ってたんですが、いやできるのかなあと思って試したら出来てしまった。
…例えば渡した先で例外が投げられると、当然コンストラクタは終わらないわけで。
C++では確かコンパイラがデストラクタをちゃんと(?)呼び出してくれるんですが、Dはどうなんだろう。その辺の記述が見つからない。
何の話だかよくわからなくなった。