Lua を実行したとき、その Lua から逆に呼び出し元にあたるクラスの
メンバ関数をコールしているところでこけていたようです。
Lua からコールされる関数は、アクセッサみたいなものなんですが
Lua にアタッチするために static になっていて、当然メンバ変数に
アクセスできません。
そこで "C++ → Lua" でコールするとき this を渡し、"Lua → C++"
でコールすときにはさっきの this を渡すようにしています。ただし
Lua はクラスの型なんか感知しないので void* に変換されます。
なので、static なアクセッサはキャストを行います。
MyObj::func_for_lua( void* sender) { MyObj* self = (MyObj*)sender; return m_Number; }
…で、ながーい前置きのあと話を昨日に戻すと
子オブジェクトは機能的にはサブセットになっていて、
生成元のスーパークラスです。けど共有する Lua ステートには、既に
サブクラスのメンバ関数がアタッチされている訳です。
そりゃまあ、何が起きてもおかしくありません。
という訳でクラス設計がまずかったようです。
そんな大げさに手を入れずに綺麗に収まりそうなのを確認して
今日は帰ってきました。