Passing Class Instances As User Pointers
Last changed: ad-remover-84.49.122.229

.

Back to SqPlus

Summary

With the latest version of SqPlus you can pass instances of classes freely between C++ and Squirrel by value/copy or by reference/pointer (must use pointer syntax on the C++ side for function declarations). If the function to be bound uses reference syntax, the function must be cast to a version using pointer arguments:


// play(SoundEffect & se) is defined using pass value by reference. We'll cast it to pass a pointer,
// which is what the compiler does during compilation (thus the code works as intended when called back). This is required by
// the template system design as pass by reference behaves as pass by copy.
// SSoundSystem is created from the actual sound system and a custom sound system for script access via the binding method:

#define USE_USER_POINTERS

#ifndef USE_USER_POINTERS

typedef int (SoundSystem::*PlaySoundEffectFunc)(SoundEffect * soundEffect);
SQClassDef sSoundSystem("SoundSystem");
sSoundSystem.staticFunc(*SoundSystem::getSoundSystem(),(PlaySoundEffectFunc)SoundSystem::play,"play");

#else // If the class instance does not need to be derefenced in script, it can be passed as an SQUserPointer to improve performance
      // or to keep the instance opaque to script:

typedef int (SoundSystem::*PlaySoundEffectFunc)(SQUserPointer soundEffect);
SQClassDef<SSoundSystem> sSoundSystem("SoundSystem");
sSoundSystem.staticFunc(*SoundSystem::getSoundSystem(),(PlaySoundEffectFunc)SoundSystem::play,"play");

#endif

SQClassDef<SGameSystem> sGameSystem("GameSystem");

#ifndef USE_USER_POINTERS // Use pointers to SoundEffect class/struct

sGameSystem.var(&SGameSystem::waitGameSoundEffect,"waitGameSoundEffect");
sGameSystem.var(&SGameSystem::startGameSoundEffect,"startGameSoundEffect");
sGameSystem.var(&SGameSystem::endGameSoundEffect,"endGameSoundEffect");

#else // Use user pointers

sGameSystem.varAsUserPointer(&SGameSystem::waitGameSoundEffect,"waitGameSoundEffect");
sGameSystem.varAsUserPointer(&SGameSystem::startGameSoundEffect,"startGameSoundEffect");
sGameSystem.varAsUserPointer(&SGameSystem::endGameSoundEffect,"endGameSoundEffect");

#endif

// === In script ===

// Create instances during init:

soundSystem <- SoundSystem();
gameSystem  <- GameSystem();

// At runtime:

soundSystem.play(gameSystem.waitGameSoundEffect);