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はどうなんだろう。その辺の記述が見つからない。
何の話だかよくわからなくなった。