1

특정 클래스 유형의 벡터가 있습니다. 벡터가 Song 클래스 내에 있지 않은 것을더 높은 순서의 함수가 배열에 적용됩니다.

vector<Song> database; 

class Song 
{ 
public: 
    string getName() const; 
    string getSinger() const; 
    unsigned int getLength(); 
    unsigned short getYear() const; 

private: 
    char singer[51]; 
    char name[51]; 
    unsigned int length; 
    unsigned short year; 
}; 

참고. 다른 클래스에 있습니다. 그 다른 반에서 나는 고차원에서 기능을 창조했다. 나는이 같은 전화를 걸 때, 그러나

void order(string, int, Song*, unsigned int (Song::*get)(), bool(*compare)(unsigned int, unsigned int)); 

: 그 함수의 매개 변수 중 하나는 노래 클래스의 게터입니다

database[a].(obj->*get()) 

내가있을 때의 기능을 처리하는 것을 이해 다른 클래스를 사용하려면 해당 클래스의 객체에 대한 참조를 제공하고 해당 클래스의 함수에 대한 참조를 제공해야합니다. 내 질문은 내가 함께 일하고있는 개체를 자동으로 감지하는 함수 참조를 전달할 수 있는지 여부입니다?

void Interface::order(string command, int findLength, 
    Song* obj, unsigned int (Song::*get)(), bool(*compare)(unsigned int first, unsigned int second)) 
{ 
    for (unsigned int a = 0; a < database.size(); a++) 
    { 
     if (compare(database[a].(obj->*get)(), stoi(command))) 
     { 
      cout << "Deleting found match...\n"; 
      database.erase(database.begin() + a); 
     } 
    } 
} 

편집 나는 database[a].(obj->*get)() 컴파일러는 멤버 이름을 예상하는 것이이 오류에 오류가 발생합니다. 그러나, 내가 통과 한 개체에 의존하지 않는 함수를 제공하고 싶습니다. 다른 말로하면, 여기에 하나의 함수를 매개 변수로 전달할 수있는 구조 유형이 있는지 묻는 것입니다.이 함수는 자동으로 각 객체 [노래 벡터로부터]와 각각의 getter 메소드를 호출합니다.

+1

나는 당신의 질문을 완전히 이해하고 있는지 확신 할 수 없다. 그러나 나는 [std :: function'] (http://en.cppreference.com/w/cpp/utility/functional/function)이 당신이 원하는 것을 . –

+0

''Song :: get'에서'this'를 사용할 수 있다는 것을 의미합니까? –

+0

''데이터베이스 [a]''송 '이 아닌가? 왜 그냥'database [a] .getLength()'하지 않는 것일까 요? – Pradhan

답변

1

멤버 함수 포인터를 통해 멤버 함수에 액세스하기위한 올바른 구문은 ->*입니다. 이는 개체에 대한 포인터가있을 때의 구문입니다.

(database[a].*get)() 

이 멤버 함수는 database[a]에서 Song 객체에 get 가리키는 부를 것이다 :

은 구성원 개체를 통해 멤버 함수에 액세스하기위한 또 다른 구문이있다.