new できないクラスを作りたい

new できなかったら、どうやって使うのかって?

CannotNew  o;                     // 使える
CannotNew* p = new CannotNew;     // 使えない (ようにしたい)
CannotNew* p = new CannotNew[3];  // 使えない (ようにしたい)

スタック上に作るのはいいけど、ヒープに作るのはやめて欲しい。

C++ には演算子の多重定義というエグい機能があって、演算子を定義し直せる。

new も演算子なので多重定義できる。

class CanNew
public:
    void* operator new(size_t sz)
    {
        return ::operator new(sz);
    }
    void* operator new[](size_t sz)
    {
        return ::operator new[](sz);
    }
};

多重定義する前と同じ動きをさせるには上のように書く (たぶん)

  • 戻り値は CanNew* ではなく void*
  • 引数は size_t
    • new CanNew したら、コンパイラがサイズを求めて渡してくれる (たぶん)

new を呼べなくするには、こんな感じに書く。

class CannotNew
{
private:
    void* operator new(size_t);    // 実体は定義しない
    void* operator new[](size_t);  // 実体は定義しない
};

これで new CannotNew すると、コンパイラが「private だから呼んじゃダメだよ」って言って教えてくれる。

できた!!
……と思いきや ::new CannotNew すると普通に new できてしまう。
そういうモンらしいので諦めた。