Pergunta

Ao fazer ligações Lua para classes C ++, deve voltar mesas ou objetos userdata?

Alguém conhece algum dos prós e contras de cada método?

Foi útil?

Solução

Eu recomendo retornar userdata. Independentemente da abordagem, tem que haver um lugar para colocar o ponteiro para o C ++ de dados, ou o real C ++ dados em si, e não há nenhum lugar segura de fazer isso com uma tabela.

Voltando mesas faria sentido em algumas situações, porque eles podem ser 'anotado' em Lua com atributos extras sem um de ter que fazer nada extra para suportar isto. Infelizmente ponteiro objecto a C ++ tem que ir a algum lugar, e não há nenhum lugar sensata para que ele vá outra do que uma entrada real na própria tabela.

Este não é um lugar muito seguro para que ele vá. Ele pode ser encontrado por Lua código, e removido ou substituído. Isto poderia ser por acidente, ou em propósito, isso realmente não importa.

A minha preferência, portanto, é retornar objetos userdata. Eles podem ser feito para trabalhar como mesas se realmente deve insistir em que, mas eles também têm uma área "secreta" (o próprio userdata real), onde o C ++ ponteiro de objeto pode ser armazenado, a salvo de substituir pelo código Lua.

(Userdata objetos também tem um ponteiro de "ambiente", que é outra lugar para dados específicos do objeto de armazenamento. Tal como acontece com a carga útil userdata -se, este valor é inacessível ao código Lua e não pode ser danificado dessa maneira.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top