2011-01-09 4 views
2

toluua ++를 사용하여 일부 C++ 클래스를 루아로 내보내고 있습니다.tolua ++ : Lua로 내 보낸 C++ 클래스에 루아 함수 추가

각 클래스가 루아 테이블에서 루아 테이블로 '구현'되어 있다는 것을 이해합니다. 따라서 새로운 메소드를 C++ 클래스에 추가하는 효과를 얻을 수 있도록 C++ 객체 테이블에 새로운 (루아) 메소드를 추가하는 것이 가능한지 궁금합니다.

Foobar 클래스를 내보내고 있다고 가정합니다.

Foobar:method1() 
Foobar:method2() 
... 

내가는 foobar 테이블에 새로운 방법 (newmethod1 및 newmethod2)를 추가 할 수 있도록하고 싶습니다

"개체를 다음과 같이

는 foobar 방법

루아에 accessisble 될 것입니다 "

나는 다음과 같은 질문이 있습니다

  1. 그것이 가능 (SECURITY) 기능을 비활성화 '확장'하는 것입니다 위에 설명 된 방식으로 내 보낸 C++ 객체의 이온 성 (ionality)?
  2. Foobar 테이블에 새로운 기능을 추가하는 방법은 무엇입니까? (저는 루아에 대해 비교적 새로운 것입니다)

답변

3

예, 기존의 내 보낸 클래스에 새로운 메소드를 추가 할 수 있습니다.

Foobar는 일반 테이블이므로 다른 테이블처럼 메소드를 연결할 수 있습니다. [1]

Foobar["extra_method"] = function (self, arg1, arg2) print(arg1, arg2) end 

을 지금 당신은 할 수 있습니다 :

Foobar:extra_method(1,2) 

1 2가 표시됩니다.

[1] tolua ++는 다소 이상하게 작동합니다. 클래스의 정적 멤버 함수 (예 : Foobar:new()) 을 클래스의 인스턴스 멤버 함수 (예 : Foobar:method1())로 유지하는 Foobar로 표시되는 각 클래스에 대해 하나의 메인 테이블을 만듭니다. lua에있는 : 연산자는 통 신당입니다. a:b()a.b(a)으로 변환됩니다. 즉, Foobar:new()에 전화하면 Foobar:new(Foobar)으로 바뀌므로 self 인수는 Foobar 테이블입니다. Foobar 유형의 객체를 만든 다음 method1()을 호출하면 self이 해당 객체가됩니다. 따라서 새 메서드 method3을 Foobar 테이블에 추가하면 Foobar:method3()obj = Foobar:new(); obj:method3()을 사용할 수 있지만 이전에는 오류가 발생합니다. 따라서,이 대답 는 tolua ++에서만 작동합니다.

편집 : 나를 여기에 실제 코드를 사용하자 주석에게

를 해결합니다.그래서 우리가 보인다는 foobar의 클래스 선언이 있다고 가정하자 같은 :

class Foobar { 
    public: 
    void method1(); 
    static void method2(); 
}; 

tolua는 ++ (이

  • 새로운 다음과 같은 방법으로 당신에게 표를 줄 것이 클래스 루아 바인딩 코드를 생성 할 때) - Foobar:new()으로 전화하여 Foobar의 인스턴스를 만듭니다.
  • delete() - 으로 전화하여 Foobar의 인스턴스를 삭제합니다.
  • method1() - instance:method1()으로 호출하여 인스턴스에서 method1을 실행합니다.
  • method2() - 방법 2를 실행하려면 Foobar:method2()이라고 부릅니다.

그러나 tolua ++는 실제로 두 개의 다른 테이블을 사용하지 않습니다 (클래스 자체에 첨부해야하는 메소드와 클래스의 인스턴스 메소드에 하나씩). 대신,이 두 가지를 병합하므로 Foobar:method1()instance:new()을 실행할 수 있습니다. 비록 방법을 사용해야하는 것은 아니지만. 따라서 정적 메서드를 사용하는 방법과 인스턴스 메서드를 사용하는 방법에는 차이가 없습니다. 구문 학적으로도 동일합니다. 설명에 대한

obj = Foobar:new() 
print(obj:method1()) 
obj:delete() 
+0

감사합니다 : 당신이 루아 내에서이 함수를 호출 할 방법 (. 나는 개인적으로이 ++ tolua에 문제가 있다고 생각)

당신이 예를 찾는 경우가 여기에있다. 정적 메소드가 호출되는 방법과 인스턴스가 호출되는 방법의 차이는 여전히 명확하지 않습니다. 나는 Foobar라는 클래스에서 메소드 호출을 추측하고 있습니다 : static_method() 및 foobarvar : instance_method()? – skyeagle

+0

기존 C++ 메소드를 덮어 쓸 수 있습니까? 어쨌든 C++ 메소드를 READONLY (즉, C++ 메소드가 할당으로 덮어 쓰지 않도록하려면?) – skyeagle

+0

예, 기존 C++ 메소드를 동일한 방식으로 겹쳐 쓸 수 있습니다. 기존 메소드의 이름을 사용하면됩니다. 읽기 전용 테이블을 만드는 것은 간단하고 절대적이지 않습니다. 여기를 참조하십시오 : http://lua-users.org/wiki/ReadOnlyTables –

관련 문제