Нужно скомпилить чтототипо этого:
//////////////////////////////////////////
class Vodka
{
void (*Drink) (void);
public:
void AddFunction(void (*FDrink)(void))
{
Drink = FDrink;
}
};
class Man
{
public:
void Drink(void){};
};
Vodka Gorilka;
Man Anonymous;
int main(void)
{
Gorilka.AddFunction(Anonymous.Drink);
return 0;
}
///////////////////////////////////////////////////////
21305% c++ main.cc
main.cc: In function `int main()':
main.cc:22: error: no matching function for call to `Vodka::AddFunction(<unknown type>)'
main.cc:6: note: candidates are: void Vodka::AddFunction(void (*)())
Что он от меня хочит я не пойму, пож-та помогите.
А почему ты решыл чё оно должно скомпилицо? Вот такое ещё может:
class Man {
public:
void Drink (void) {};
};
class Vodka {
void (Man::* Drink) (void);
public:
void AddFunction (void (Man::* FDrink) (void)) {
Drink = FDrink;
}
};
int main (void) {
Vodka Gorilka;
Man Anonymous;
Gorilka.AddFunction (&Man::Drink);
return 0;
}
Вот проблемма то в том и заключается, что в классе Vodka не обезательно должен быть Man. Мож надо будет проделать для разных классво типа Bag, Dog, Cat на вообше малоли чего.
> Мож надо будет проделать для разных классво типа Bag, Dog, Cat на вообше малоли чего.
А что, не судьба сделать абстрактный класс Drinker и унаследовать Dog, Cat, Man от него, и соответственно в класс Vodka добавить метод, у которого параметр ссылается не на класс Man, а на класс Drinker?
Читайте ООП, мать вашу, используйте наследование в грамотной иерархии классов, и оставьте в покое эти дурацкие C-шные привычки передавать указатели на функции!
>Читайте ООП, мать вашу, используйте наследование в грамотной иерархии классов, и оставьте в покое эти дурацкие C-шные привычки передавать указатели на функции
+1. И если уж так нужно передать функию - почему бы не создать класс-функтор, перегрузить ему operator() и передавать его?
У Александреску детально описан процесс создания обобщённого
функтора.
Шаблон Loki::Functor очень прост в использовании.
Ещё можно использовать boost::function.