2014-09-16 4 views
1

C++ 클래스의 생성자에 코드 함수를 전달할 수 있는지 궁금한가요?클래스 생성자에서 함수 코드 전달

class.hpp 아이디어는 뒤에 내가 내 개체를 만들 때 내가 인스턴스화 할 수있는 comparaison 기능을 갖고 싶어입니다

class A { 
    public: 
     A(void (*f)(parameters ...); 
    private: 
     void comp(parameters ...); 
} 

class.cpp

#include "class.hpp" 
A::A(void (*f)(parameters ....) { 
    &comp = &f; 
} 

.

고맙습니다.

+0

확실히 할 수 있지만 comp는 함수 선언이며 포인터는 dec와 같지 않습니다. 그것을 털어 놓았다 –

답변

1

예, 어쨌든 구문은 함수 포인터를 사용한 것이 아니다 선언 :

class A { 
    public: 
     A(void (*f)(int a)) : comp(f) {}; 
    private: 
     void (*comp)(int a); // Function pointer 
}; 

void comparisonFun(int a) { 
//... 
} 

int main() 
{ 
    A obj(comparisonFun); 
} 

당신이 comp 기능을 선언했다

class A { 
    public: 
     A(void (*f)(parameters ...); 
    private: 
     void comp(parameters ...); 
} 

을 수행하여.

0

다음은이 작업을 수행하는 방법입니다. 여기에 PFN과 같은 함수 포인터 유형을 정의한 다음 우아함을위한 함수 포인터로 전달할 때 매개 변수 유형을 사용하십시오.

void somefn(int a, char c) { 
    // do something 
} 

typedef void (*PFN)(int, char); 

class A { 
    public: 
     A(PFN pf); 
    private: 
     PFN comp; 
}; 

A::A(PFN pf) { 
    comp = pf; 
} 

int main() 
{ 
    A a(somefn); 
    return 0; 
} 
0

예, 멤버 함수 포인터 타입

void (*comp)(/*parameters*/); 

을하고 당신이 선호하는 경우, 다른 종류의

comp = f; 

에게 것 또는 같은 값을 할당하면, 생성자의 이니셜 라이저 목록에서 초기화하십시오.

A(void (*f)(/*parameters*/)) : comp(f) {} 

함수 포인터 유형 당신은 기능을 초기화 할 std::function를 사용 lambda 표현을 사용할 수 있습니다

typedef void Comp(/*parameters*/); 
Comp * comp; 
0

를 입력 약간 서투른 때문에 당신은, 타입 별칭을 사용하는 것이 더 편리 찾을 수 있습니다

class A { 
    public: 
     typedef std::function<void(int,int)> CompFun; 

     A(CompFun f) : comp(f) { } 
    private: 
     CompFun comp; 
}; 

그리고

A a([](int a, int b) 
    { 
     return a < b; 
    }); 
+0

나는 그것을 시험해 볼 것이다. –

관련 문제