У меня есть вектор определенного типа класса;
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;
};
Обратите внимание, что вектор не входит в класс Song. Это в другом классе. В этом другом классе я создал функцию более высокого порядка. Одним из параметров этой функции является метод получения из класса Song:
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)()
Ошибка в том, что компилятор ожидал имя члена. Тем не менее, я хочу дать функцию, которая не зависит от объекта, который я передал. Другими словами, я спрашиваю, существует ли тип конструкции, который позволяет мне передавать здесь одну функцию в качестве параметра, и эта функция будет автоматически вызывать каждый объект [из вектора песен] и соответствующий ему метод получения.
Вы правы насчет ->*
синтаксис для доступа к функциям-членам через указатель на функцию-член: это синтаксис, когда у вас есть указатель на объект.
Существует другой синтаксис для доступа к функции-члену через объект-член:
(database[a].*get)()
Это вызвало бы функцию-член, на которую указывает get
на Song
объект в database[a]
,