powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Почему нельзя передавать параметром метод класса?
25 сообщений из 94, страница 2 из 4
Почему нельзя передавать параметром метод класса?
    #33922317
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще минус - производный класс от класса задания (TimerTask) не имеет доступа к приватным методам и свойствам основного класса.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33922325
raven_unix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, хорошая статья про трудности с указателями на методы класса:
http://]http://www.rsdn.ru/article/cpp/fastdelegate.xml
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33922348
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
raven_unix
Всего лишь создать абстрактный класс.
Код классов менять даже не придется (только сделать их наследниками этого класса).


Делать класс программы/модуля наследником класса таймера - не кажется мне хорошей идеей.
1. Если он пользует таймер, потоки, ... то от всего этого он должен наследоваться?
2. Он не сможет нормально пользовать несколько таймеров, т.к. функция таймаута одна.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33922414
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
raven_unixКстати, хорошая статья про трудности с указателями на методы класса:
http://]http://www.rsdn.ru/article/cpp/fastdelegate.xml

Хорошая статья. Было бы время, сел бы почитал, а пока нашел очень интересные замечания:

Указатели на функции-члены и реализация самых быстрых делегатов на С++
рассмотрим файл, состоящий лишь из следующего кода. Это правильный код на С++.

class SomeClass;
typedef void (SomeClass::*SomeClassFunction) (void);
void Invoke(SomeClass *pClass, SomeClassFunction funcptr)
{
(pClass->*funcptr)();
};

Заметьте, что компилятор генерирует ассемблерный код для вызова функции-члена через указатель, ничего не зная о классе SomeClass. Точнее, пока линковщик не выполнит крайне умудренную оптимизацию, код должен корректно работать независимо от настоящего определения класса. Прямое следствие из этого - можно безопасно вызывать метод класса через указатель на функцию-член, приведенный от указателя на функцию-член совершенно другого класса.

Указатели на функции-члены и реализация самых быстрых делегатов на С++
Хитрость: приведение любого указателя на функцию-член к стандартной форме

Основа моего кода – класс, который конвертирует произвольный указатель на класс и произвольный указатель на функцию-член в общий указатель на класс и общую функцию-член. В С++ нет типа «общая функция-член», поэтому я привожу к функциям-членам неопределенного класса CGenericClass.


Ваши комментарии?
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33922474
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh...Ваши комментарии?

пока искал эту батву - сами раскопали...
думал привидилось из си бимоля с его дилегатами...ан нет...
угумс...дышать будет...

с уважением
(круглый)
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33922591
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно и без наследования. Метод start делаем шаблонным, и передаем ему не указатель на метод класса, а фнкциональный объект - наследник unary_function или binary_function. Ну в оющем как в алгоритмах STL
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33922632
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возникла проблема с приведением функции-члена:

Код: plaintext
1.
    timerRegister->start((TimerGeneric*)this, (TimerProcPGeneric)tRegisterPult, this,  0 ,  1 );
матершина
pult_wrapper.cpp:36: error: argument of type `void (Pult_wrapper::)(void*)'
does not match `void (TimerGeneric::*)(void*)'


Код: plaintext
1.
    timerRegister->start((TimerGeneric*)this, (TimerProcPGeneric)&tRegisterPult, this,  0 ,  1 );
матершина
pult_wrapper.cpp:36: error: ISO C++ forbids taking the address of an
unqualified non-static member function to form a pointer to member function.
Say `&Pult_wrapper::tRegisterPult'
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33922651
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedМожно и без наследования. Метод start делаем шаблонным, и передаем ему не указатель на метод класса, а фнкциональный объект - наследник unary_function или binary_function. Ну в оющем как в алгоритмах STL

Можно поподробней про это? Особенно про "функциональный объект".
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33922695
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhВозникла проблема с приведением функции-члена:....

хе-хе...

вот так усё пучком будет...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
class Obj
{
	int a;
public:
	Obj(void)
	{
		a =  0 ;
	};
	void do_something(void)
	{
		a =  1 ;
	};
};

typedef void (Obj::*do_something) (void);
void Invoke(Obj *pClass, do_something funcptr) 
{
(pClass->*funcptr)(); 
};

	Obj obj;

	Invoke(&obj, &Obj::do_something);


изменённые имена думаю Вас не напугают...ну и самые нижнии строчки - вызов...

(круглый)
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33922733
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0изменённые имена думаю Вас не напугают...ну и самые нижнии строчки - вызов.


Напугали. :) Мне кажиться, это не то, что я хочу. Мне надо подменить класс в первом параметре (что, проходит успешно) и притвориться, что я передаю, его функцию, предоставляя, на самом деле, указатель своей.
В вашем примере такой замены я не обнаружил.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33922794
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделав подмену по синтаксису как посказал kolobok0, не создавая класса, а в его конструкторе, компиляция прошла успешно. Очень интересно, т.к. при указании, просто функции, понятно, что она подразумевается относительно this, но если она прописана как функция из области этого класса (и она не статическая), то синтаксес (мне кажется) более удален от привязки к конкретному объекту. Поэтому поведение компилятора мне кажется странным.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33922876
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhСделав подмену...

может всё таки с базовым-виртуальными посмотрите конструкцию ? Ведь по логике вещей обращаясь к декларированному интерфейсу (вирутальным методам) Вы будете не явно использовать именно то, что хотите юзать ручками. в таблице виртуальных методов именно адреса и валяются...обращаясь к таким методам процессор переходит именно по смещению на тот адресс который хранится в искомой ячейке.

Минусов, тут не видно в принцепе (кстати не обязательно концентрировать обработку в наследнике и пытаться постучаться к приват данным. можно её переместить и в базовый класс, который по мере необходимости будет "запрашивать" необходимые "типизированные" данные)..
А плюсы - это подведена концепция ООА, контроль при написании вызова - на уровне компиляции, оптимально реализованный код...

Есть кстати очень интересные схемы юзанья именно данного подхода - использование виртуальных методов... На мой взгляд не плохо данную тематику раскрыл Джэфри Элджер в книге "C++".
Например в ГУИ при обработке того или иного события от графики нужно привести полученный воид тип от неё, к нечто чёткому и позвать соответствующий метод. Проблема усложняется, если нуна по разному отрабатывать разные граф. сушности... После прочтения данной книги Вы выкинете нафик методы которые возвращают тип участвующих объектов и ненужные свитчи... Код станет более понятнее и будет контролироваться на этапе компиляции...просто и со вкусом...


с уважением
(круглый)
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33922947
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0
может всё таки с базовым-виртуальными посмотрите конструкцию ? ...

Минусов, тут не видно в принцепе (кстати не обязательно концентрировать обработку в наследнике и пытаться постучаться к приват данным. можно её переместить и в базовый класс, который по мере необходимости будет "запрашивать" необходимые "типизированные" данные)..
А плюсы - это подведена концепция ООА, контроль при написании вызова - на уровне компиляции, оптимально реализованный код...
...


С точки зрения ООП - собака это дочерний объект от животного, но не от таймера.

А как же тогда поступать с несколькими таймерами в одном классе? В этом подходе все будет через одну функцию, в ней появяться еще параметры, появяться свичи. Программа будет уже не такой наглядной.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33923003
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhС точки зрения ООП - собака это дочерний объект от животного, но не от таймера.

А как же тогда поступать с несколькими таймерами в одном классе? В этом подходе все будет через одну функцию, в ней появяться еще параметры, появяться свичи. Программа будет уже не такой наглядной.

a) а мона исходную задачу?
b) нужно сущность чаво ?
c) И зачем куча таймеров ?
d) задача свитча - точка "растипизации"...если у Вас один класс юзает кучу свитчей - то где тут "растипизация" ?

просто трудно понять, что треба в конечном итоге..

(круглый)
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33923056
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
union
{
void (Obj1::*do_something1) (void);
void (Obj2::*do_something2) (void);
void *ptr;
};
а такое хавает?
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33923162
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дауш.
мне в с++ сильно не хватает такой фишки как в object pascal.

пока обхожусь виртуальными функциями и иерархией(в том числе с множественным наследованием, полезная вещь!)

но вот все думаю поднатареть еще маленько в шаблонах и переделать все на шаблонах :)
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33923785
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0

a) а мона исходную задачу?
b) нужно сущность чаво ?
c) И зачем куча таймеров ?
d) задача свитча - точка "растипизации"...если у Вас один класс юзает кучу свитчей - то где тут "растипизация" ?

просто трудно понять, что треба в конечном итоге..


а) Сейчас обсуждается, общая задача:
а1) Утилита, производящая вызов каллбака задачи
а2) Задача, котороя хотит зарегестирировать каллбаком свой метод.
b) Любой приклодной задачи/класса
с) могет быть. Задачи разные бывают. :)
д) А как тогда раелизовать в одном каллбаке кучу таймеров?

Задача имеет общее постановление, т.к. желательно чтобы, обсуждаемый метод ее решения был универсален. Т.е. вырабаталась определенная структура или проекция на определенные универсальные методы/структуры.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33923803
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo
Код: plaintext
1.
2.
3.
4.
5.
union
{
void (Obj1::*do_something1) (void);
void (Obj2::*do_something2) (void);
void *ptr;
};
а такое хавает?

Было предложено 3 метода решения! Это к какому?
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33924655
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akhа1) Утилита, производящая вызов каллбака задачи
а2) Задача, котороя хотит зарегестирировать каллбаком свой метод.
b) Любой приклодной задачи/класса
с) могет быть. Задачи разные бывают. :)
д) А как тогда раелизовать в одном каллбаке кучу таймеров?


всё равно, скажем так, остаються вопросы чаво хочется... и почему не устраивает наследование с виртуальными методами...
пример...
есть некий общий функционал (пускай будет потоковый класс, в задачи которого сводиться вся потоковая обвязка - синхроный старт, синхронный стоп, безопасная передача-приём параметров и куча всякой мелочёвки)... Никто не мешает передавать через "шлюзы" классы отнаследованные от некоего базового имеющего метод "Run". Этот метод уже будеть зваться в отдельном потоке с передачей ему потоковых данных (например открытые сокеты, базы либо ышо что)...всё... Теперь достаточно типизированный Ваш клас, прикрывающий определённую сущность отнаследовать от базового и перегрузить виртуальные методы типа Run, Initialize, DeInitialize...

Так не катит ? Или я не так Вас понял?

По поводу реализации в коллбэке "тучу таймеров" - тут что то не понятное...Т.е. сначала херим типизацию, а потом разгребаем ? Это типа из рода садо-мазо ? Ну можно... Думаю если обложить такой свитч ышо парочкой do-while будет круче смотреться...Правда мало толку, но зато как в старину - много строчек :) Или опять я, что то не понял ?


удачи Вам
(круглый)
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33924728
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0
всё равно, скажем так, остаються вопросы чаво хочется... и почему не устраивает наследование с виртуальными методами...
пример...
есть некий общий функционал (пускай будет потоковый класс, в задачи которого сводиться вся потоковая обвязка - синхроный старт, синхронный стоп, безопасная передача-приём параметров и куча всякой мелочёвки)... Никто не мешает передавать через "шлюзы" классы отнаследованные от некоего базового имеющего метод "Run". Этот метод уже будеть зваться в отдельном потоке с передачей ему потоковых данных (например открытые сокеты, базы либо ышо что)...всё... Теперь достаточно типизированный Ваш клас, прикрывающий определённую сущность отнаследовать от базового и перегрузить виртуальные методы типа Run, Initialize, DeInitialize...

Так не катит ? Или я не так Вас понял?

По поводу реализации в коллбэке "тучу таймеров" - тут что то не понятное...Т.е. сначала херим типизацию, а потом разгребаем ? Это типа из рода садо-мазо ? Ну можно... Думаю если обложить такой свитч ышо парочкой do-while будет круче смотреться...Правда мало толку, но зато как в старину - много строчек :) Или опять я, что то не понял ?


удачи Вам
(круглый)

Возмьмем ваш пример, в качестве основы. Вроде бы он подходит. Так вот, допустим вамему объекту, созданному по классу, дочернему к некоторому классу с функцией Run, надо заюзать несколько таких потоковых объектов. В этом случае вы создаете 2 этих объекта и каждому кидаете свою функцию Run. Тогда, как минимум, вам надо будет передовать в параметре, структуру, типа:
Код: plaintext
1.
2.
3.
4.
typedef struct {
   class_potok *komu_peredal;
   void *other_parametres;
}
потом по ней определять, какой же объект потока вызвал этот Run (это я имел в виду, когда говорил про свич).

По второму пункту - похоже, что мы говорим о разных вещах.

И еще вопрос: мне кажется, что наследовать собаку от потока не есть гуд, т.к. это не соответствует логике ООП. имхо.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33924835
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подробнее... скоро дегьги буду брать:)
Пoказываю
# include <ctime>
# include <iostream>
# include <functional>

template <typename Ret, typename T>
class noarg_fun_t
{
public:
typedef Ret (T::*F)(void);
typedef Ret result_type;

explicit noarg_fun_t(T& t, F f) : __p(t), __f(f) {}
Ret operator() (void) { return (__p.*__f)(); }
private:
T& __p;
F __f;
};

template <typename T>
class noarg_void_fun_t
{
public:
typedef void (T::*F)(void);

explicit noarg_void_fun_t(T& t, F f) : __p(t), __f(f) {}
void operator() (void) { (__p.*__f)(); }
private:
T& __p;
F __f;
};

template <typename Arg, typename Ret, typename T>
class arg_fun_t : public std::unary_function<Arg, Ret>
{
public:
typedef Ret (T::*F)(Arg);

explicit arg_fun_t(T& t, F f) : __p(t), __f(f) {}
Ret operator() (Arg arg) { return (__p.*__f)(arg); }
private:
T& __p;
F __f;
};

template <typename Arg, typename T>
class arg_void_fun_t : public std::unary_function<Arg, void>
{
public:
typedef void (T::*F)(Arg);

explicit arg_void_fun_t(T& t, F f) : __p(t), __f(f) {}
void operator() (Arg arg) { (__p.*__f)(arg); }
private:
T& __p;
F __f;
};

class Timer
{
void wait(const timeval&) {}
public:
template <typename Func>
Func start(Func func, const timeval& timeout)
{
wait(timeout);
func();
return func;
}

template <typename Func, typename Arg>
Func start(Func func, Arg arg, const timeval& timeout)
{
wait(timeout);
func(arg);
return func;
}
};


using namespace std;

class A
{
public:
void dump() { cout << "A::dump() called" << endl;}
ostream& dump(ostream& out) { return out << "A::dump(ostream&) called" << endl; }
};


int main()
{
A a;
Timer tm;
timeval timeout;

typedef noarg_void_fun_t<A> Func1;
typedef arg_fun_t<ostream&, ostream&, A> Func2;

// И как он разобрал какую функцию выбрать???
tm.start(Func1(a, &A::dump), timeout);
// Пришлость явно инстанциировать, иначе cerr юудет передаваться
// как ostream, а y ios_base конструктор копирования в private
tm.start<Func2, ostream&>(Func2(a, &A::dump), cerr, timeout);
}
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33925372
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhВозникла проблема с приведением функции-члена:
Код: plaintext
1.
    timerRegister->start((TimerGeneric*)this, (TimerProcPGeneric)&tRegisterPult, this,  0 ,  1 );
матершина
pult_wrapper.cpp:36: error: ISO C++ forbids taking the address of an
unqualified non-static member function to form a pointer to member function.
Say `&Pult_wrapper::tRegisterPult'

Ну и ? Вам в сообщении об ошибке подсказывают: надо
Код: plaintext
1.
    timerRegister->start((TimerGeneric*)this, (TimerProcPGeneric)&Pult_wrapper::tRegisterPult, this,  0 ,  1 );
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33925390
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akhа) Сейчас обсуждается, общая задача:
а1) Утилита, производящая вызов каллбака задачи
а2) Задача, котороя хотит зарегестирировать каллбаком свой метод.ну. Давно решённая задача. Чем тебя не устраивают обработчики событий?
AkhБыло предложено 3 метода решения! Это к какому?приведение типов.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33925418
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneНу и ? Вам в сообщении об ошибке подсказывают: надо

Уже разобрался 11 топиков вверх. ;) Топик от 17:30 вчера (лень ссылку ставить :) ).
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33925442
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhВозмьмем ваш пример, в качестве основы. Вроде бы он подходит. Так вот, допустим вамему объекту, созданному по классу, дочернему к некоторому классу с функцией Run, надо заюзать несколько таких потоковых объектов. В этом случае вы создаете 2 этих объекта и каждому кидаете свою функцию Run.хмм... так у тебя всё-таки утилита вызывает задачу или куча классов вызывают друг друга как хотят? Зачем такой хаос может понадобиться?
...
Рейтинг: 0 / 0
25 сообщений из 94, страница 2 из 4
Форумы / C++ [игнор отключен] [закрыт для гостей] / Почему нельзя передавать параметром метод класса?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]