2011-01-20 6 views
3

저는 루아와 C++로 무언가를 시도해 왔습니다. 그리고 모든 "쉬운"함수가 작동합니다. 즉, 루아와 다른 방법으로 C++ 함수를 호출 할 수 있습니다. 주위에, 그러나 나는 1 개의 주요한 문제가있다.C++/lua 함수에서 멤버 함수를 호출 할 수 없습니다.

작은 게임/시뮬레이터를 만드는 중이며 lua, ode를 사용하고 LuaOde와 같은 직접적인 인터페이스가 아닌 내 자신의 작은 인터페이스를 만들고 싶었습니다.

main class //creates instances of Visual, Physics and LuaAddons 
    v = new Visual(); 
    p = new Physics(); 
    l = new LuaAddons(); 

는 지금은 물론 LuaAddons에서 물리학 얘기하고 싶지 다음과 같이 내 코드 구조입니다. 그래서 LuaAddons.cpp에서 내가 가진 :

int setWorldGravity(lua_State* L){ 
    float x = luaL_checknumber(L, 1); 
    float y = luaL_checknumber(L, 2); 
    float z = luaL_checknumber(L, 3); 
    //Here I need to somehow talk to p (Physics())  
    return 0; 
} 

나는 단순히 내 .lua 파일에 setWorldGravity(1, 2, 3)를 호출 할 수 있습니다 그 방법과 위의 기능이 통과 올바른 매개 변수에 따라 호출된다.

그러나 여기에 문제가 있습니다. 그 안에서 int setWorldGravity 나는 응용 프로그램의 물리 부분에 전화를하고 중력을 설정하는 ODE 호출이 부식 기능을 호출하고 싶습니다.

그래서 Physics.h에서 내가 가진 :

그 매개 변수를 사용하여 올바른 ODE 함수를 호출
void setWorldGravity(float x, float y, float z); 

: world_ 그것이 첫째 주에 의해 시작되었을 때 세상이 만들어

void Physics::setWorldGravity(float x, float y, float z){ 
    dWorldSetGravity (world_, x, y, z); 
} 

을 수업.

그러나 LuaAddons의 int setWorldGravity(lua_State* L)은 그 클래스의 멤버가 아니기 때문에 (즉, LuaAddons.h에는 정의되어 있지 않습니다. 정적 인 경우) 나는 내 인생을 생각할 수 없습니다. 단수 실체에 접근하는 방법 Physics(); 기능 자체 내에서. 분명히 LuaAddons가 동일한 세계를 가지지 않기 때문에 Physics의 새로운 인스턴스를 만들 수는 없습니다. 내가 무엇을 시도했다

은 다음과 같습니다

l = new LuaAddons(p); 

LuaAddons(Physics* p); 

(LuaAddons.h에) 및

LuaAddons(Physics* p){ 
    phys_ = p; // where phys_ is a private member of LuaAddons.h 
} 

(LuaAddons.cpp에) 내가 시도하지만 때 어디 추가 할 항목 :

phys_->setWorldGravity(x, y, z); // error C2065: 'phys_' : undeclared identifier 

함수가 phys_에 대해 알지 못하기 때문에 (큰 놀라움) 작동하지 않습니다.

나는 또한 Lunar.h 라이브러리를 사용해 보았습니다. 이걸로 루아 함수를 멤버 함수로 바꿀 수 있고, .h에서 선언하고 실제로는 _-> stuff라고 부를 수 있습니다. 라이브러리는 회원 전화를 위해 .lua에 발신자 (마음이 주춤 거린다)의 새로운 인스턴스를 만들기 위해 당신을 강제로 그러나 :

la_ = LuaAddons() 
la_:setWorldGravity(1, 2, 3) 

그러나이 방법 물리학 부분에 대한 링크가 기본으로 사라 생성자는 전달 된 포인터를 가져 오지 않습니다.이 호출이 객체를 통과하자마자 ODE에 적용되는 부분에 도달하면 null 포인터 또는 무언가 포인터가 있다고 가정합니다.

나는 추측 할 수 있겠지만 사실 물리학 세계가 정확히 작동하는지 확인하고 싶다면 거의 루아 파일을 통해 Physics 포인터를 전달해야합니다. 그러나 나는 어떻게 사소한 생각을하지 않았다.

오랫동안 읽지 못해서 유감이지만 철저히 철저히 조사하여 중요한 세부 사항은 생략하십시오.

어떤 도움이나 생각이라도 대단히 감사하겠습니다.

답변

3

C++에서 멤버 함수는 기본적으로 숨겨진 매개 변수가있는 함수입니다. 효과적으로 당신이 실제로 얻을

class Foo { 
    const int bar_; 

    public: 
    Foo(int b) : bar_ { } 
    int get_bar() 
    { 
     return bar_; 
    } 
}; 

Foo f(5); 
f.get_bar(); 

을 :하지만 당신은 쓰기 C++에서

Foo f = Foo_constructor(5); 
Foo_get_bar(f); 

는이 숨겨진 매개 변수는 this 포인터라고 (파이썬에서이 self의 다른 언어는 다른 이름을 가지고).

그것은 C 숨겨진 매개 변수를 전달하는 C++ 멤버 함수를 호출하는 C와 유사한 함수입니다.

void setWorldGravityWrapper(Physics* p, int x, int y, int z) 
{ 
    return p->setWorldGravity(x, y, z); 
} 

다른 기술이있다 (멤버 함수에 대한 포인터가 제공 : 객체가 함수를 호출하는 가장 쉬운 해결책은 멤버 함수가 수행하는 모든 매개 변수를 C 함수, 플러스 추가 매개 변수를 작성하는 것입니다 마음에), 그러나 이것은 당신을 시작해야합니다.

관련 문제