Ruby-C ++ 확장의 C ++ 클래스에서 비 정적 메서드를 작성하는 방법은 무엇입니까?

B 살 룬케

Ruby-C ++ 확장을 개발 중입니다. CPP 클래스에 비 정적 메서드를 작성해야하고 클래스 인스턴스를 사용하여 루비 클라이언트에서 해당 클래스 메서드를 호출해야합니다.

다음은 main.cpp입니다.

#include "ruby.h"
#include <iostream>
using namespace std;

class Mclass
{
        public:
        int i;
        static VALUE newMethod(VALUE self);
        static VALUE newInitialize(VALUE self);
};

VALUE Mclass::newMethod(VALUE self)
{
        cout<<"It is newMethod() method of class Mclass"<< endl;
        return Qnil;

}
VALUE Mclass::newInitialize(VALUE self)
{
        cout<<"It is newInitialize() method of class Mclass"<< endl;
        return Qnil;
}

extern "C" void Init_Test(){
   VALUE lemon = rb_define_module("Test");
   VALUE mc = rb_define_class_under(lemon, "Mclass", rb_cObject);
   rb_define_method(mc, "new",
      reinterpret_cast< VALUE(*)(...) >(Mclass::newMethod), 0);
   rb_define_method(mc, "initialize",
      reinterpret_cast< VALUE(*)(...) >(Mclass::newInitialize), 0);
}

또한 다음은 루비 클라이언트 코드입니다.

require 'Test'
include Test

a = Mclass.new

루비 클라이언트에서 "Mclass"의 인스턴스를 얻을 수 있습니다. 그러나 루비 클라이언트에서 클래스 비 정적 메서드를 호출하고 싶습니다. CPP 클래스에 비 정적 메서드를 추가하려면 어떻게해야합니까?

토르스텐 로비츠 키

C 바인딩을 사용하여 함수를 C 함수로 래핑해야합니다. 객체 (일명 this)와 모든 인수를 해당 C 함수에 전달하고 none 정적 함수를 호출합니다. https://github.com/TorstenRobitzki/Sioux/blob/master/source/rack/bayeux.cpp를 볼 수 있습니다 . 여기서 bayeux_server는 루비에서 호출 할 수있는 update_node () 함수가있는 클래스입니다.

다른 좋은 출발점은 http://ruby-doc.com/docs/ProgrammingRuby/ 장 "루비 확장"입니다. 기본적으로 가비지 수집기가 자신의 클래스에 저장된 모든 Ruby 개체 (VALUE)에 도달 할 수 있는지 확인해야합니다. 그렇지 않으면 마크 및 스윕 수집기가이를 제거합니다. 테스트 중에 GC를 수동으로 호출하여 수집해서는 안되는 일부 개체가 수집되는지 확인할 수 있습니다.

extern "C" VALUE newInitialize(VALUE self)
{
    MyClass* s = 0;
    Data_Get_Struct( self, MyClass, s );
    s->newInitialize();
}

사용하지 마십시오 reinterpret_cast!

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

C ++의 상속 된 클래스에서 일반 메서드를 정적 메서드로 변경하는 방법은 무엇입니까?

분류에서Dev

비 클래스 함수 C ++에서 클래스 내 함수를 작성하는 방법은 무엇입니까?

분류에서Dev

C ++에서 정적 메서드를 비동기 적으로 호출하는 방법은 무엇입니까?

분류에서Dev

C ++에서 비 정적 자바 메서드를 호출하는 방법은 무엇입니까?

분류에서Dev

Ruby에서 클래스 변수를 혼합 모듈의 동적으로 생성 된 클래스 메서드에 전달하는 방법은 무엇입니까?

분류에서Dev

D : 확장 클래스에서 불변 메서드를 재정의하는 방법은 무엇입니까?

분류에서Dev

Objective-C에서 메서드를 재정 의하여 하위 클래스를 임시로 정의하는 방법은 무엇입니까?

분류에서Dev

C #에서 문자의 너비를 안정적으로 결정하는 방법은 무엇입니까?

분류에서Dev

실제로 C #에서 비동기 메서드를 작성 / 종료하는 방법은 무엇입니까?

분류에서Dev

C ++의 클래스에서 함수 메서드를 재귀 적으로 호출하는 방법은 무엇입니까?

분류에서Dev

C ++에서 클래스의 모든 암시 적 (기본) 메서드를 삭제하는 방법은 무엇입니까?

분류에서Dev

Ruby에서 온 것 : 정적 메서드를 TypeScript의 추상 클래스로 이동하는 방법은 무엇입니까?

분류에서Dev

C #에서 클래스 / 개체를 중첩하는 가장 효율적인 방법은 무엇입니까?

분류에서Dev

C # WPF에서 사용자 지정 클래스를 저장하는 방법은 무엇입니까?

분류에서Dev

Ruby / Rails 메타 프로그래밍, 인스턴스 및 클래스 메서드를 동적으로 정의하는 방법은 무엇입니까?

분류에서Dev

C ++의 클래스 생성자 내부에서 스레드를 사용하는 방법은 무엇입니까?

분류에서Dev

Objective-C : 포드 종속성에서 소스 코드를 비활성화하는 매크로를 정의하는 방법은 무엇입니까?

분류에서Dev

C #의 동기화에서 비동기 메서드를 호출하는 방법은 무엇입니까?

분류에서Dev

TypeScript에서 메서드로 클래스를 동적으로 확장하는 방법은 무엇입니까?

분류에서Dev

C ++에서 정적 클래스를 구현하는 방법은 무엇입니까?

분류에서Dev

C ++에서 정적 클래스 객체를 초기화하는 방법은 무엇입니까?

분류에서Dev

루비의 특정 클래스에서만 클래스를 초기화하는 방법은 무엇입니까?

분류에서Dev

Objective-C Noob : 메인에서 메서드를 정의하고 호출하는 방법은 무엇입니까?

분류에서Dev

C #에서 genric 유형이있는 정적 클래스의 모든 "인스턴스"를 수집하는 방법은 무엇입니까?

분류에서Dev

C # 및 Winforms에서 DataGridView의 특정 행에서 드래그를 비활성화하는 방법은 무엇입니까?

분류에서Dev

C #의 다른 메서드에서 동일한 클래스의 메서드를 호출하는 방법은 무엇입니까?

분류에서Dev

C ++에서 파생 클래스가 기본 클래스 정적 메서드를 재정의하는 방법이 있습니까?

분류에서Dev

C # 기본 클래스 내의 파생 클래스에서 특정 형식의 모든 필드를 가져 오는 방법은 무엇입니까?

분류에서Dev

Ruby에서 네임 스페이스 클래스를 정의 해제하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    C ++의 상속 된 클래스에서 일반 메서드를 정적 메서드로 변경하는 방법은 무엇입니까?

  2. 2

    비 클래스 함수 C ++에서 클래스 내 함수를 작성하는 방법은 무엇입니까?

  3. 3

    C ++에서 정적 메서드를 비동기 적으로 호출하는 방법은 무엇입니까?

  4. 4

    C ++에서 비 정적 자바 메서드를 호출하는 방법은 무엇입니까?

  5. 5

    Ruby에서 클래스 변수를 혼합 모듈의 동적으로 생성 된 클래스 메서드에 전달하는 방법은 무엇입니까?

  6. 6

    D : 확장 클래스에서 불변 메서드를 재정의하는 방법은 무엇입니까?

  7. 7

    Objective-C에서 메서드를 재정 의하여 하위 클래스를 임시로 정의하는 방법은 무엇입니까?

  8. 8

    C #에서 문자의 너비를 안정적으로 결정하는 방법은 무엇입니까?

  9. 9

    실제로 C #에서 비동기 메서드를 작성 / 종료하는 방법은 무엇입니까?

  10. 10

    C ++의 클래스에서 함수 메서드를 재귀 적으로 호출하는 방법은 무엇입니까?

  11. 11

    C ++에서 클래스의 모든 암시 적 (기본) 메서드를 삭제하는 방법은 무엇입니까?

  12. 12

    Ruby에서 온 것 : 정적 메서드를 TypeScript의 추상 클래스로 이동하는 방법은 무엇입니까?

  13. 13

    C #에서 클래스 / 개체를 중첩하는 가장 효율적인 방법은 무엇입니까?

  14. 14

    C # WPF에서 사용자 지정 클래스를 저장하는 방법은 무엇입니까?

  15. 15

    Ruby / Rails 메타 프로그래밍, 인스턴스 및 클래스 메서드를 동적으로 정의하는 방법은 무엇입니까?

  16. 16

    C ++의 클래스 생성자 내부에서 스레드를 사용하는 방법은 무엇입니까?

  17. 17

    Objective-C : 포드 종속성에서 소스 코드를 비활성화하는 매크로를 정의하는 방법은 무엇입니까?

  18. 18

    C #의 동기화에서 비동기 메서드를 호출하는 방법은 무엇입니까?

  19. 19

    TypeScript에서 메서드로 클래스를 동적으로 확장하는 방법은 무엇입니까?

  20. 20

    C ++에서 정적 클래스를 구현하는 방법은 무엇입니까?

  21. 21

    C ++에서 정적 클래스 객체를 초기화하는 방법은 무엇입니까?

  22. 22

    루비의 특정 클래스에서만 클래스를 초기화하는 방법은 무엇입니까?

  23. 23

    Objective-C Noob : 메인에서 메서드를 정의하고 호출하는 방법은 무엇입니까?

  24. 24

    C #에서 genric 유형이있는 정적 클래스의 모든 "인스턴스"를 수집하는 방법은 무엇입니까?

  25. 25

    C # 및 Winforms에서 DataGridView의 특정 행에서 드래그를 비활성화하는 방법은 무엇입니까?

  26. 26

    C #의 다른 메서드에서 동일한 클래스의 메서드를 호출하는 방법은 무엇입니까?

  27. 27

    C ++에서 파생 클래스가 기본 클래스 정적 메서드를 재정의하는 방법이 있습니까?

  28. 28

    C # 기본 클래스 내의 파생 클래스에서 특정 형식의 모든 필드를 가져 오는 방법은 무엇입니까?

  29. 29

    Ruby에서 네임 스페이스 클래스를 정의 해제하는 방법은 무엇입니까?

뜨겁다태그

보관