shared_ptr erfordert vollständigen Typ; kann es nicht mit lua_State * verwenden

8

Ich schreibe einen C ++ / OOP-Wrapper für Lua. Mein Code ist:

%Vor%

Das Problem ist, dass lua_State unvollständig ist und der shared_ptr -Konstruktor den vollständigen Typ benötigt. Und ich brauche sichere Zeigerfreigabe. (Funny ding boost docs sagen die meisten Funktionen erfordern keine vollständigen Typ, aber Konstruktor erfordert, so dass es keine Möglichkeit gibt, es zu verwenden. Ссылка )

Kann ich das lösen? Danke.

    
topright gamedev 12.03.2010, 15:17
quelle

3 Antworten

4

Sie verwenden Ihren eigenen Deleter, was bedeutet, dass Sie bei der Erstellung keinen vollständigen Typ benötigen. Die einzige Voraussetzung ist, dass CustomDeleter das verarbeiten kann. (Es kann zB den übergebenen Zeiger in einen vollständigen Typ umwandeln (zB von void* nach CompleteType* ).

Der Hintergrund der Vollständigkeit ist, dass, sobald der Konstruktor von shared_ptr mit dem Default-Deleter aufgerufen wird, er eine Klasse mit der Zeile delete p; instanziiert - und damit dieser Code korrekt ist, darf p nicht sein unvollständig. Der Destruktor wird diesen Deleter-Code indirekt aufrufen, so dass es nicht auf die Vollständigkeit des Typs ankommt.

Wenn Sie jedoch Ihren eigenen Deleter übergeben, gelten die Anforderungen Ihres eigenen Deleters. Stellen Sie sicher, dass CustomDeleter definiert ist, nachdem lua_State abgeschlossen wurde.

    
Johannes Schaub - litb 12.03.2010, 15:55
quelle
1

Es schien seltsam, dass boost::shared_ptr einen vollständigen Typ für die Instanziierung benötigt, also schrieb ich diesen kleinen Test, der das Gegenteil zeigt (Code am Ende).

Ich glaube, dass das Problem nicht darin besteht, dass der Typ vollständig sein muss, sondern mit dem zweiten Argument, das Sie an den shared_ptr -Konstruktor übergeben, der wie eine Elementfunktion aussieht. Das zweite Argument muss etwas sein, das mit einem einzelnen Zeigerargument aufgerufen werden kann. Wenn Sie eine Memberfunktion Ihres Wrappers verwenden möchten, können Sie boost::bind verwenden, um die Schnittstelle anzupassen.

Vielleicht meinst du?:

%Vor%

Demonstration, dass boost::shared_ptr keine vollständigen Typen benötigt:

%Vor%     
quelle
0

Da ein lua_State * nicht geklont werden kann, ist das Kopieren eines LuaState-Objekts sinnvoll? Was ist die erwartete Semantik des Kopierens eines inhärent nicht kopierbaren Objekts?

Das Verhalten, das Sie zu haben scheinen, ist oberflächliches Kopieren - und das ist am besten, wenn LuaState nicht kopierbar ist und die Lebensdauer des lua_State verwaltet, dann können Sie den Status als% weitergeben. co_de%.

    
Joe Gauterin 12.03.2010 16:20
quelle

Tags und Links