2012-06-07 2 views
0

this 질문에 제공된 솔루션을 사용하려고합니다. 나는 "remove_if"클래스 내에서 술어 함수를 사용했다.C++ 클래스 내에서 술어 함수 포인터 사용

void classname::function1() 
    { 
    vector<NeighborPoint> neighbors; 
    .... 
    neighbors.erase(std::remove_if(neighbors.begin(),neighbors.end(),&classname::cannotMoveIn), neighbors.end()); 
    ... 
    } 

    bool classname::cannotMoveIn(NeighborPoint mp) 
    { 
     return !mp.inGridNotOccupied; 
    } 

해당 코드가 클래스에없고 술어가 구성원 함수가 아닌 경우이 코드가 작동합니다. 그러나 이제는 remove_if 템플릿과 프리디 케이트 매개 변수의 비 호환성 (하나의 오류 포함 : 오류 C2064 : 용어는 인수 1 개를 취하는 함수로 평가되지 않음)을 참조하는 것으로 보이는 긴 오류 메시지가 표시됩니다.

참고 : 코드는 상담원이 이동할 수없는 인접 그리드 셀 (8 개의 가능한 셀 중)을 제거하려고합니다.

누구에게 잘못된 생각이 있습니까?

+0

당신의 술어가'NeighborPoint'를 입력 매개 변수로 받아 들여야하지 않습니까? 귀하의 벡터는 'NeighborPoint' 타입입니다. 'MoorePoint'와'NeighborPoint'는 관련이 있습니까? –

+0

죄송합니다. MoorePoint를 NeighborPoint로 변경하여 여기에 게시 할 때 명확하게 나타내지 만 그 중 하나를 놓쳤습니다. – wmac

답변

1

그 코드가 작동합니다.

물론. 인스턴스 메소드는 전역 함수와 같지 않습니다. this (호출 된 객체)에 대한 추가 숨겨진 매개 변수가 필요합니다. 그러나 현재 함수에서 현재 객체를 사용할 필요가없는 것 같습니다. 처음에 왜 인스턴스 메소드로 만들었습니까?

this을 사용할 필요가없는 경우, 정적 메서드 (범위를 제외하고는 일반 함수처럼)를 만들 수 있습니다. 그런 다음 이전처럼 정규 함수처럼 전달할 수 있습니다. 술어 함수보다 더 나은 것은 함수 오브젝트를 사용하는 것입니다 (클래스에서 이동하지 않으려는 경우에는 중첩 클래스가 될 수있는 펑 터 클래스를 정의해야합니다) 또는 람다 (C++ 11), 이는 술어가 제거 알고리즘에 인라인 될 수있게하여 매번 함수 포인터를 호출하는 것보다 빠르다.

+0

감사합니다. 실제로 나는 술어 함수를 정적으로 만들 필요가 있었다. – wmac

1

사용 std::bind : @Als가 지적한대로 벡터 NeighborPoint을 포함하는 동안 또한, 당신의 classname::cannotMoveIn 방법은 인수로 MoorePoint 소요

neighbors.erase(std::remove_if(neighbors.begin(),neighbors.end(),std::bind(&classname::cannotMoveIn, this, std::placeholders::_1)), neighbors.end()); 

. 이러한 clases가 관련되어 있다고해도 값의 인수를 사용하므로 벡터의 객체를 조각화합니다.

나는 당신의 방법은 다음과 같은 서명이한다고 생각 :이 클래스에 아니었고 술어가 아닌 멤버 함수 인 경우

bool classname::cannotMoveIn(const NeighborPoint &mp) const; 
+0

죄송합니다. MoorePoint를 NeighborPoint로 변경하여 여기에 게시 할 때 명확하게 나타내지 만 그 중 하나를 놓쳤습니다. – wmac

+0

위대한, 그럼, 어쨌든 그 방법에 대해 제공 한 서명을 사용해야합니다. 그렇지 않으면 아무 이유없이 개체를 복사하게됩니다. – mfontanini

+0

참조 용으로 std : bind1st와 std : mem_fun을 사용할 수도 있습니다. 'neighbors.erase (neighbors.begin(), neighbors.end(), std :: bind1st (std :: mem_fun (& classname :: cannotMoveIn), this)), neighbors.end()); – JsDoITao