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 できてしまう。
そういうモンらしいので諦めた。