0

C++ から lua などの基本クラスにエクスポートしました。

class IState
{
    public:
        virtual ~IState() { }

        virtual void Init() = 0;
        virtual void Update(float dSeconds) = 0;
        virtual void Shutdown() = 0;
        virtual string Type() const = 0;
};

// Wraper of state base class for lua
struct IStateWrapper : IState, luabind::wrap_base
{
    virtual void Init() { call<void>("Init"); }
    virtual void Update(float dSeconds) { call<void>("Update", dSeconds); }
    virtual void Shutdown() { call<void>("Shutdown"); }
    virtual string Type() const { return call<string>("Type"); }
};

輸出コード:

        class_<IState, IStateWrapper>("IState")
            .def("Init", &IState::Init)
            .def("Update", &IState::Update)
            .def("Shutdown", &IState::Shutdown)

次の部分: 私は関数を持つ StateManager を持っています:void StateManager::Push(IState*)そしてそれはエクスポートです:

        class_<StateManager>("StateManager")
            .def("Push", &StateManager::Push)

ここで、IState 型のオブジェクトを Lua で作成し、それを StateManager にプッシュします。

-- Create a table for storing object of IState cpp class
MainState = {}

-- Implementatio of IState::Init pure virtual function
function MainState:Init()
    print 'This is Init function'
end

function MainState:Update()
    print 'this is update'
end

function MainState:Shutdown()
    print 'This is shutdown'
end

state = StateManager
state.Push(MainState)

もちろん、これはうまくいきません。IState 型のオブジェクトの場合、MainState と言う方法がわかりません。

error: No matching overload found, candidates: void Push(StateManager&,IState*)

UPD

    module(state, "Scene") [
        class_<StateManager>("StateManager")
            .def("Push", &StateManager::Push),

        class_<IState, IStateWrapper>("IState")
            .def("Init", &IState::Init)
            .def("Update", &IState::Update)
            .def("Shutdown", &IState::Shutdown)
    ];

    globals(state)["StateManager"] = Root::Get().GetState(); // GetState() returns pointer to obj

例の後:

class 'MainState' (Scene.IState)
function MainState:__init()
    Scene.IState.__init(self, 'MainState')
end
...
state = StateManager
state:Push(MainState())

エラー: クラス 'IState' に静的 '__init' がありません

そして、state = StateManagerブラケットを持っている必要がありますか?それらには、そのような演算子がないというエラーがあります。

4

1 に答える 1

2

Luabind でテーブルを投げることはできません。Luabind で定義されたクラスから派生する場合は、Luabind の規則に従う必要があります。クラスから派生した Luabind の tools を使用して Lua クラスを作成する必要がありますIState。それは次のようになります。

class 'MainState' (IState) --Assuming that you registered IState in the global table and not a Luabind module.

function MainState:__init()
    IState.__init(self, 'MainState')
end

function MainState:Init()
    print 'This is Init function'
end

function MainState:Update()
    print 'this is update'
end

function MainState:Shutdown()
    print 'This is shutdown'
end

state = StateManager()
state:Push(MainState())

また、最後の 2 行の変更にも注意してください。具体的には、単に に設定するのではなく、StateManager を呼び出すstate方法です)。また、どのように使用state:し、しないでstate.ください。このコードがあなたの例でどのように機能したかはわかりません。

于 2012-07-14T17:43:20.483 に答える