2009-04-29 2 views
4

순수 가상 클래스의 C++ 객체를 기대하는 함수에 전달하고 싶습니다. 순수 가상 C++ 클래스에서 파생 된 클래스의 Lua 객체입니다. 어떻게해야합니까?함수는 추상 타입 A의 C++ 객체를 기대합니다. 어떻게 A 서브 클래스의 루아 객체를 전달합니까?

나는 루아와 루아 파인드를 처음 사용하므로 나와 함께 곰. C++에서

: 루아에서

struct A { 
    virtual void foo() = 0; 
}; 

void do_something(A* a) { 
    a->foo(); 
} 

: C++ 다시

class 'MyA' (A) 
.... 
function MyA:foo() 
    print('hi') 
end 

:

... // somehow create an instance of MyA class and named myA 
    // How? 
    // Maybe the result of a call to "MyA()"? 

do_something(myA); 
+0

이 질문은 편집 된 이유가 무엇입니까? 새 제목이 너무 일반적입니다. – z8000

답변

2

당신은 당신의 순수 가상 함수를 구현하는 C++ 클래스를 생성 할 것입니다, 루아 코드를 호출한다. 구현은 여기에 던지기에는 너무 복잡 할 것입니다.

기본 의사 코드 :

예는 매우 높은 수준이지만, 싶은 것은 아닌 사소한 것을 보여주기 위해 의미 있다고
// C++ 
struct LuaA : public A 
{ 
    LuaA(const std::string &luacode) 
    : myLuaHandler(luacode) 
    { 
    } 

    virtual void foo() 
    { 
    myLuaHandler.call("MyA:foo()"); 
    } 
} 

. Lua 코드에 실제로 노출시키고 자하는 새로운 "LuaA"입니다. 일반적으로

나는 루아에 노출 및 기타 스크립트 언어에 대한 내 C++를 포장 할 때 SWIG를 사용하는 것을 선호합니다. SWIG는 귀하가 관심을 갖고있는 가상 메서드 (SWIG 용어로 "디렉터"라고 함)의 오버로드를 지원하지만 Lua/SWIG는 디렉터를 지원하지 않습니다. Java, C#, Ruby, Perl 및 Python 모두 SWIG에서 디렉터를 지원합니다. 루아에서 왜 지원되지 않는지 정확히 알지 못합니다.

는 루아가 상속을 지원하지 않기 때문에, 당신이 달성하고자하는 것의 정확한 의미는 당신이 제안하는 방식으로 간단하게 할 수없는 것을 할 수 있습니다.

아마도 다른 사람이 루아 사이드에 대한 더 나은 대답을 갖고 있습니까? LuaBind 문서의

+0

이것은 아래의 Aaron의 솔루션과 유사합니다. 나는 이것이 아마도 내가 갈 방법이라고 생각한다. 지루한 일이지만 효과가있을 것입니다. 감사! – z8000

2

항을 참조 10.1. 기본적으로 Lua 구현을 통과하는 LuaBind 클래스에 간단한 C++ 래퍼를 제공합니다. 다음은이 문서에서 다음과 같은주의 :

virtual void f(int a) 
{ 
    call<void>("f", a); 
} 

호출 ("F"를, a)는 인수를 전달 루아 'F'함수를 호출합니다.

+0

그래, 지루한 일이기 때문에 이것을 피하려고했지만 설치가 끝나면 끝났다고 가정합니다. 알았어 고마워! – z8000

2

미안 해요, 난 당신이 직접 질문 한 질문에 대답하지 않을, 대신에 개인적인 경험에서 조언을 조금 제공 할 것입니다 :

당신이 새로운 루아에, 당신은 심각하게 작성 고려해야 할 경우 당신의 첫 번째 바인딩은 원시 루아 API이며 그러한 객체 지향 레이아웃은 없습니다. 적어도 이 실제로 인 것을 이해하게 될 것입니다.

루아 API는 자체적으로 사용하기에 매우 편합니다. 여분의 오버 헤드가 발생하지 않으며 어떤 일이 일어나고 있는지 완전히 제어 할 수 있습니다. 루아 바인드 도서관의 개발은 조금 낡은 것입니다. (하지만 인생에 다시 돌아온 것 같습니다.)

이 실제로 인 경우 Lua 쪽에서 특히 C++ 쪽에서 C++ 클래스에서 파생되어야 함을 모범으로 고려해야합니다. 그런 것은 루아에게는 그리 자연스럽지 않으므로 구현하는데 눈에 띄는 오버 헤드가 필요합니다. 또한 C++에서는 다른 언어로 호출하는 것이 아니라는 사실을 숨기고 있습니다. 잘 문서화되어 있지 않은 한, 이는 성능 문제의 잠재적 인 원인입니다.

루아와 함께 작업을 시작한 지 몇 년 전, Luabind와 같은 방법으로 바인딩을 작성하고 C++ 객체에서 모방 한 것을 모방했습니다. 이제 순수 루아 API와 단순한 절차 적 (객체 지향적이지 않은) 크로스 언어 인터페이스를 사용하고 있습니다. 그 결과로 나는 더 행복해.

+0

이것은 분명히 유효한 문제입니다. 이 질문의 이유는 이미 클래스 기반 시스템 (Apache Thrift)을 사용하고 있으며 C++ 대신 루아에서 서비스 핸들러를 구현하고자하기 때문입니다. 나는 C++로 서비스 핸들러를 구현하는 패턴을 피하려고 노력했으며, 메소드는 본질적으로 루아를 호출한다. 루아 자체에서 서브 클래스를 만들기를 바랬다. 아아, 지금까지 게시 된 세 가지 솔루션 (Alexander, Aaron, lefticus)이 본질적으로 혼합되어 있다고 생각합니다. 감사합니다. – z8000

1

순수 가상 클래스를 C++로 서브 클래스화한 다음 luabind (Aaron 및 lefticus의 솔루션에 따라)로 시작합니다. 이 오버 헤드가 너무 크면 알렉산더 당연히 Lua C stack-twiddling API를 사용할 것이다.

따라서 여기에는 아무 대답도 없습니다. 나는 나중에 결과와 함께 의견을 게시 할 것이다.

감사합니다.

관련 문제