2017-10-10 3 views
3

저는 C++ 클래스를 가지고 있지만 저수준 C도 사용하고 있기 때문에 bsearch 함수를 사용해야합니다. bsearch의 마지막 인수는 비교 함수이며 클래스의 const 개인 변수에 액세스 할 수 있도록 함수를 구현하려고합니다.멤버 함수를 std :: bsearch와 함께 사용하는 방법

문제는 비교 함수를 멤버 함수로 만들면 정규 함수 포인터로 변환 할 수 없으므로 작동하지 않는다는 것입니다. 비회원 함수를 만들면 그 값을 bsearch으로 전달할 수는 있지만 클래스의 private 변수에 액세스 할 수는 없습니다.

어떻게해야합니까?

예 : enter image description here

3은 비교 함수 필요가 3 elements.16,32,56 actors.I'm 오프셋 array.I에서 검색을 검색 할 필요 bsearch bytes.I 오프셋되어있다 수단 배우를 비교할 것이지만 나는 const 함수의 위치를 ​​계산하기 위해 const void * actorFile 포인터가 필요하다. function.actorFIle은 클래스 private 변수이다.

+0

@StoryTeller 빠른 답장을 보내 주셔서 감사합니다. 순수한 bsearch를 사용하여 완료 할 수 없습니까? 또한 lower_bound를 빠르게 보았고 cmp 함수도 필요합니다.이 경우 bsearch와 어떤 차이가 있습니까? – sparrow2

+0

'std :: lower_bound'는 어떤 종류의 펑터 (함수 나 람다를 포함한 연산자()가 정의 된 객체)를 취할 수 있습니다. 객체를 사용하면 비교를 수행하는 데 필요한 변수를 보유 할 수 있습니다. – vu1p3n0x

+0

비공개 멤버에 게터를 제공하면 compare 함수는 자유 함수가 될 수 있습니다. 비공개 멤버가 클래스 외부에서 액세스 할 필요가없는 경우 액세스 할 필요가있는 경우이를 공개하거나 액세스 할 수있는 방법을 제공하십시오. – user463035818

답변

7

해결 방법은 C 라이브러리 함수를 사용하지 않고 C++을 사용하는 것입니다. C++ 표준 라이브러리에는 유틸리티 검색 기능이 있는데 std::lower_bound이라고합니다. 일반 함수와 유사한 객체를 수용합니다. 일반적인 함수 포인터가 아닙니다.

이것은 당신이 당신의 클래스를 캡처하는 람다 식으로 전화를 걸 수 있습니다 :

당신은 정말 비 멤버 함수 내부에 멤버 함수를 사용 bsearch에 연결하는 경우
std::lower_bound(start, finish, value, [this] (auto const& lhs, auto const& rhs) { 
       /* Compare and utilize anything this can point to*/ }); 
+0

lower_bound를 사용하는 것이 더 좋을지 만, 저는 실제로 bsearch에 묶여 있습니다. – sparrow2

+0

@ sparrow2 - 나는 정말로 어떻게 보이지 않습니다. 'bsearch'는 일반 배열로만 동작하며, lower_bound는 일반 C 배열로도 동작합니다. – StoryTeller

+0

@ sparrow2 당신은 케이크를 가지고 그것을 먹을 수 없습니다. 'bsearch'는 클래스와 멤버 함수에 대해 아무것도 모르는 C 함수입니다. –

1

. 따라서 사적인 멤버에 액세스 할 필요가 없습니다.

/* Create global variable to use in compare proc*/ 
actors_data_base* cmp_data_base = NULL; 

/* Write compare routine like */ 
int cmp_proc(const void * a, const void * b) 
{ 
    size_t a_offset = static_cast<size_t>(a); 
    size_t b_offset = static_cast<size_t>(b); 
    return cmp_data_base->compare_actors(a_offset, b_offset); 
} 


/* Set global pointer and use bsearch */ 
actors_data_base = &my_data_base; 
bsearch(&my_value, array, size, sizeof(size_t), cmp_proc); 

분명히 이것은 전역 변수를 사용하기 때문에 추한 것입니다. 그러나 이것은 proc을 비교하기위한 컨텍스트를 전달하는 유일한 방법입니다. 당신은 당신이 훨씬 훨씬 더 std::lower_bound를 사용하는 것,

따라서 (cmp_proc 인해 글로벌 VAR에 동시에 사용할 수 없습니다) 스레딩 문제를 방지하기 위해 스레드 로컬 저장소를 사용하여 생각할 수있다.

+0

컴파일러는 클래스 파일의 비 멤버 함수 내에서 멤버 함수를 사용할 수 없습니다. 인스턴스가없고 해당 인스턴스의 멤버 메서드를 호출하면 – sparrow2

+0

명확하게 설명해 드리겠습니다. 나는 예제를 추가 할 것이다. – ivaigult