Domanda

Quando creo i bind Lua per le classi C ++, dovrei restituire tabelle o oggetti userdata?

Qualcuno conosce i pro e i contro di ciascun metodo?

È stato utile?

Soluzione

Raccomando di restituire userdata. Indipendentemente dall'approccio, ci deve essere un posto dove mettere il puntatore ai dati C ++ o ai dati C ++ effettivi stessi e non c'è nessun posto sicuro farlo con un tavolo.

Restituire le tabelle avrebbe senso in alcune situazioni, perché possono essere "annotato" in Lua con attributi extra senza che uno debba fare qualcosa in più per supportare questo. Sfortunatamente il puntatore all'oggetto C ++ deve andare da qualche parte, e non c'è nessun posto ragionevole per andare altro di una voce effettiva nella tabella stessa.

Questo non è un posto molto sicuro dove andare. Può essere trovato da Lua codice e rimosso o sostituito. Questo potrebbe essere accidentale o accesa scopo, non importa davvero.

La mia preferenza è quindi quella di restituire oggetti userdata. Possono essere fatto funzionare come tavoli se si deve davvero insistere su questo, ma loro hanno anche un "segreto" area (lo stesso userdata stesso) in cui il C ++ il puntatore all'oggetto può essere archiviato, al sicuro dalla sovrascrittura con il codice Lua.

(Gli oggetti Userdata hanno anche un puntatore "ambiente", che è un altro posto per memorizzare dati specifici dell'oggetto. Come con il payload di userdata stesso, questo valore è inaccessibile al codice Lua e non può essere danneggiato in questo modo.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top