루아에 일부 클래스를 노출시키기 위해 tolua ++를 사용하는 C++ 호스트가 있습니다. 클래스 중 하나는 루아의 콜백을 등록해야하는 함수를 가지고있다. 그래서 C++ 코드가 루아 등록 함수를 호출 할 필요가있을 때 가능합니다. 그러나 함수는 테이블/클래스 함수입니다. 이전에 문자열 함수 이름 (루아 "클래스"의 일부가 아닌)을 성공으로했지만 루아 함수와 함수 이름을 어떻게 든 저장할 수 있다면 궁금합니다.C++에서 루아 콜백
내가 좋아하는 내 루아 클래스를 정의하십시오 MyClass의 내부
MyClass = {}
function MyClass:Create()
local obj = {}
-- copy all functions from MyClass table to this local obj and return it
local k,v
for k,v in pairs(obj) do
obj[k] = v
end
return obj
end
function MyClass:Enter()
self.CPlusClass = CPlusClass:Create() -- this is the C++ class creation, I defined a static function Create()
self.CPlusClass:RegisterCallback(15, self.Callback) -- this is where I want to pass this instances function to be called back from the C++ class
end
function MyClass:Callback(reader)
-- I want to be able to use self here as well so it needs to be the same instance
end
: 나는 "클래스"기능 MyClass에 :: 콜백은 C에서 호출 할 수있는 루아를 등록 할 곳이다) (입력 ++ 목적. 이걸 C++ 함수에 어떻게 전달할 것입니까? C++의 Callback()이 "self"를 전달하여 클래스의 동일한 "인스턴스"가되도록 MyClass : Callback()이 호출되도록 형식이 무엇입니까?
그래서 'self'는 내가 만든 실제 변수를 말하는 것이고 변수 이름으로 전역 테이블에 있다고 가정하지만 루아 "클래스"안에있을 때 어떻게 변수 이름을 ' 자아 '도 역시 언급하고 있습니까? 만약 내가 그것을 얻을 수있는 내 C + + 함수에 전달하고 그 특정 테이블을 얻기 위해 getglobal을 호출 할 수 있도록 문자열로 저장하고 다음 또한 테이블 함수 이름을 문자열로 전달할 수 및 C++에서 수 그것을 얻고 그것을 부르십시오. 하지만 질문은, 내가 어떻게 '자체'를 실제 변수 이름으로 변환 할 수 있을까요? C에서 getglobal을 호출하여 해당 테이블을 가져올 수 있습니까?
'self'는 전역 변수가 아니며, self는'table : function' 구문 설탕에 의해 정의 된 자동 변수입니다. 'function table : class (args ...) ... end'는'function table.class (self, args ...) ... end'와 동일합니다. 비슷하게'tab : class (args ...) '에 대한 호출은 tab.class (tab, args ...)와 동일하다. –
그 점을 이해합니다. 그러나 자아는 내가 루아 프로그램의 어딘가에서 만든 테이블을 가리킨다. 어떤 변수 이름이 자기 자신을 가리키는 지 어떻게 알 수 있습니까? – user441521
함수를 해당 테이블 "개체"에서 연결 해제하고 "개체"테이블에서 나중에 다시 사용할 수 없습니다. 콜백 함수로 클로저를 만들어 여기에서 수행하려는 작업을 수행해야합니다. –