Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как передать метод объекта в функцию? 
:(
    Опции темы
tararataka
Дата 9.9.2010, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 21.8.2010

Репутация: нет
Всего: нет



Ну и собственно, как?  smile  Я разобрался как передавать функции и объекты. А метод объекта в функцию не влазит.  smile 
PM MAIL   Вверх
djamshud
Дата 9.9.2010, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 8
Всего: 39



Код

void foo(void(Class::*ptr)(int,double));


Как-то так.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
azesmcar
Дата 9.9.2010, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Код

class X
{
public:
    void foo()
    {
        std::cout << "X::foo()" << std::endl;
    }
};

typedef void (X::*method)();

void call(X* ptr, method xm)
{
    (ptr->*xm)();
}

int main() 
{
    X x;
    method m = &X::foo;
    call(&x, m);
}

речь об этом?
PM   Вверх
tararataka
Дата 9.9.2010, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 21.8.2010

Репутация: нет
Всего: нет



djamshud azesmcar
Ага, спасибо, это оно самое.

То есть мне нужно передать и адрес на объект и на метод класса, а потом "соединить" их.

А я могу делать это как-то более универсально, ну что-бы проделывать это с объектами разных классов? Или это единственный путь?
PM MAIL   Вверх
mrbrooks
Дата 9.9.2010, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 2
Всего: 306



tararataka, здесь на мой взгляд самый кошерный ФАК по твоему вопросу. 
PM MAIL   Вверх
azesmcar
Дата 9.9.2010, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(tararataka @  9.9.2010,  13:09 Найти цитируемый пост)
А я могу делать это как-то более универсально, ну что-бы проделывать это с объектами разных классов? Или это единственный путь? 

можно подробнее?
PM   Вверх
djamshud
Дата 9.9.2010, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 8
Всего: 39



tararataka, указатель на член класса А не получится использовать с объектом класса В, если только они не находятся в родственных связях. Если вы об этом.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
tararataka
Дата 9.9.2010, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 21.8.2010

Репутация: нет
Всего: нет



Кстати. Вот ещё подробный туториал. Я по нему разбираюсь.
http://www.newty.de/fpt/index.html

azesmcar
Цитата
можно подробнее?

Эээээ. Ну для сумрачного плана.

djamshud
Цитата
указатель на член класса А не получится использовать с объектом класса В, если только они не находятся в родственных связях. Если вы об этом.

Тогда шаблоны?

Это сообщение отредактировал(а) tararataka - 9.9.2010, 14:48
PM MAIL   Вверх
tararataka
Дата 9.9.2010, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 21.8.2010

Репутация: нет
Всего: нет



Так вот шаблон.
Код

template<typename TO> // TO - Type Object
void tdeleg(TO *pt2Object, void (TO::*p2method)()) {
    (pt2Object->*p2method)();
}


Он позволяет этой функции работать с любыми классами.
Код

tdeleg(&any,&Any::tails);

Но всё равно это неудобно. Нужно давать адрес объекта, затем ещё адрес функции класса. Нельзя это как-нибудь тоже оптимизировать? Что бы я указал только метод any.tails , а препроцессор бы превратил это в нужное выражение?
PM MAIL   Вверх
Леопольд
Дата 9.9.2010, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



tararataka, если метод не статический, то ему в аргументах передаётся указатель на интанс класса, который известен под именем this.


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Cheloveck
Дата 9.9.2010, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 3
Всего: 32



А ведь об этом написано почти во всех книгах. Вы пробовали почитать?
user posted image


--------------------
user posted image
PM Jabber   Вверх
tararataka
Дата 10.9.2010, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 21.8.2010

Репутация: нет
Всего: нет



Леопольд
Цитата

tararataka, если метод не статический, то ему в аргументах передаётся указатель на интанс класса, который известен под именем this. 

 smile 

С использованием этого указателя можно переписать шаблон так, что бы передавать внутрь только что то вроде &any.tails ? 

Код

template<typename TO> // TO - Type Object
void tdeleg(TO *pt2Object, void (TO::*p2method)()) {
    (pt2Object->*p2method)();
}

PM MAIL   Вверх
Cheloveck
Дата 10.9.2010, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 3
Всего: 32



tararataka, у каждого объекта класса свой набор данных. Статические методы принадлежат классу, а не объекту. Таким образом из статического метода нельзя работать с не статическими данными объекта (собственно объекта не будет). ТО, что вы хотите - невозможно, в принципе. Ещё раз настоятельно рекомендую прочитать учебник по C++. Там всё написано.


--------------------
user posted image
PM Jabber   Вверх
tararataka
Дата 10.9.2010, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 21.8.2010

Репутация: нет
Всего: нет



Цитата

ТО, что вы хотите - невозможно, в принципе.

Это снимает вопрос. Но вот в куте же это реализовано. Или это они там через свой moc нашаманили?  smile 

Cheloveck
Цитата
Ещё раз настоятельно рекомендую прочитать учебник по C++.

Ну ты бы название что-ли сказал. А ту книжку что я читал, так там про эти Function Pointers, Callbacks and Functors ничего нет. Ну кроме упоминания предикатов в в стл.

Это сообщение отредактировал(а) tararataka - 10.9.2010, 09:36
PM MAIL   Вверх
Cheloveck
Дата 10.9.2010, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 3
Всего: 32



Цитата(tararataka @  10.9.2010,  09:35 Найти цитируемый пост)
там через свой moc нашаманили?

Да, в куте не совсем C++.


Цитата(tararataka @  10.9.2010,  09:35 Найти цитируемый пост)
Ну ты бы название что-ли сказал.

Бьерн Страуструп - Язык программирования C++


--------------------
user posted image
PM Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0580 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.