LINUX.ORG.RU

Помогите с указателями на функции в Ц++


0

0

Нужно скомпилить чтототипо этого:
//////////////////////////////////////////
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;
}

bugmaker ★★★★☆
()
Ответ на: комментарий от bugmaker

Вот проблемма то в том и заключается, что в классе Vodka не обезательно должен быть Man. Мож надо будет проделать для разных классво типа Bag, Dog, Cat на вообше малоли чего.

ASM ★★
() автор топика
Ответ на: комментарий от ASM

> Мож надо будет проделать для разных классво типа Bag, Dog, Cat на вообше малоли чего.

А что, не судьба сделать абстрактный класс Drinker и унаследовать Dog, Cat, Man от него, и соответственно в класс Vodka добавить метод, у которого параметр ссылается не на класс Man, а на класс Drinker?

Читайте ООП, мать вашу, используйте наследование в грамотной иерархии классов, и оставьте в покое эти дурацкие C-шные привычки передавать указатели на функции!

class Drinker { abstract void DrinkIt(); }

class Vodka { Drinker * dd; void setDrinker(Drinker * d) { dd = d; } void Drink() { dd->DrinkIt(); } }

class Man::Drinker { void DrinkIt(); }

...

Vodka * Gorilka = new Vodka(); Man * dumb = new Man();

...

Gorilka->setDrinker( dumb );

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi

>Читайте ООП, мать вашу, используйте наследование в грамотной иерархии классов, и оставьте в покое эти дурацкие C-шные привычки передавать указатели на функции

+1. И если уж так нужно передать функию - почему бы не создать класс-функтор, перегрузить ему operator() и передавать его?

Sectoid ★★★★★
()

#include <boost/bind.hpp>
#include <boost/function.hpp>

class Vodka
{
	typedef boost::function<void (void)> DrinkFunc_t;
	DrinkFunc_t Drink;
public:
	void AddFunction(DrinkFunc_t FDrink)
        {
			Drink = FDrink;
		}
};

class Man
{
public:
	void Drink(void){};
};

Vodka Gorilka;
Man Anonymous;
int main(void)
{
	Gorilka.AddFunction(boost::bind(&Man::Drink, &Anonymous));

	return 0;
}

vasirck
()
Ответ на: комментарий от Krivenok_Dmitry

У Александреску детально описан процесс создания обобщённого 
функтора.
Шаблон Loki::Functor очень прост в использовании.

Ещё можно использовать boost::function.

Krivenok_Dmitry
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.