powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Почему нельзя передавать параметром метод класса?
94 сообщений из 94, показаны все 4 страниц
Почему нельзя передавать параметром метод класса?
    #33921384
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На счет статического понятно - можно, а вот, обычный метод, почему нельзя? Даже, если прописать объект, которому он пренадлежит?

Типа такого:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
class a {
    void f(){};
}

a::a() {
    func1(this->f);
}
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33921434
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Че за юх, при явном привидении типа?:

матершина компилятора
pult_wrapper.cpp:7: error: argument of type `void (Pult_wrapper::)(short
unsigned int, unsigned char*, short unsigned int)' does not match `void
(*)(short unsigned int, unsigned char*, short unsigned int)'
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33921444
raven_unix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А объявление func() можно увидеть?
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33921507
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
raven_unixА объявление func() можно увидеть?

А какая разница? Он не может сделать явное приведение типов.

Но для представления, сейчас выкину листинги
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33921521
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Pult_wrapper::Pult_wrapper() {
    l3=new Level3;
    if (l3) l3->registerCb(PC_PULT, (Level3Cb)(this->cbL3));
}

void Pult_wrapper::cbL3(unsigned short nTs, unsigned char *buf, unsigned short buf_len) {

}

Код: plaintext
1.
2.
3.
4.
5.
typedef void (*Level3Cb)(unsigned short return_param, unsigned char *buf, unsigned short buf_len);

class Level3 {
    public:
        short registerCb(unsigned short type, Level3Cb cb);
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33921555
raven_unix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто приведение из типа "указатель на метод класса" к типу "указатель на функцию" невозможно.
При вызове метода класса ему всегда передается указатель this.
Если бы возможно приведение к типу "указатель на функцию", то откуда компилятор бы взял указатель this.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33921613
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
raven_unixПросто приведение из типа "указатель на метод класса" к типу "указатель на функцию" невозможно.
При вызове метода класса ему всегда передается указатель this.
Если бы возможно приведение к типу "указатель на функцию", то откуда компилятор бы взял указатель this.

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

PS: То, что в конструкторе и функциях класса, this подразумевается, сам собой, это понятно. В данном случае, я его указал для наглядности.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33921784
raven_unix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я понимаю, что в Вашем примере указатель this был приведен только для наглядности.

Я говорю о том, что две совсем разные операции - вызов простой функции и вызов метода класса. При вызове функции, происходит переход на адрес функции и передача параметров, а при вызове метода класса дополнительно происходит передача указателя this.

Или Вы хотите, чтобы указатель был как на простую функцию, а компилятор знал, что это не простая функция, а метод класса.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33921795
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно, всё можно, там тип вызова надо указать правильно
Вот например определение метода, вызывающегося при событии (Билдер):
Код: plaintext
typedef void __fastcall (__closure *TNotifyEvent)(System::TObject* Sender);
__closure - указывает, что это метод класса, и что при его вызове компилятор передаёт this
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33921890
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С this наконец-то мне доперло. :)

Тогда вопрос - а как это сделать в обычных С++? __closure он не понимает в принципе.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33921930
raven_unix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__closur, если я не ошибаюсь - фишка Borland'a


А без этого надо заменить
Код: plaintext
typedef void (*Level3Cb)(unsigned short return_param, unsigned char *buf, unsigned short buf_len);

на
Код: plaintext
typedef void (ClassName::*Level3Cb)(unsigned short return_param, unsigned char *buf, unsigned short buf_len);
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33921962
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
raven_unix__closur, если я не ошибаюсь - фишка Borland'a


А без этого надо заменить
Код: plaintext
typedef void (*Level3Cb)(unsigned short return_param, unsigned char *buf, unsigned short buf_len);

на
Код: plaintext
typedef void (ClassName::*Level3Cb)(unsigned short return_param, unsigned char *buf, unsigned short buf_len);


А без имени класса можно? Типа, сказать, что это будет класс, но какой не скажу. Пусть молча сохраняет this и передает. Как в Борланде.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33921968
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhКак в Борланде
хочешь как в бормане, в нём и пиши :)
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33922012
raven_unix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Карабас Барабас AkhКак в Борланде
хочешь как в бормане, в нём и пиши :)

Это точно.
Не позоляет С++ так делать.
А жаль.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33922021
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
raven_unix
ru> Не позоляет С++ так делать.
ru> А жаль.
Моё ИМХО состоит в том, что должна быть возможность и в других реализациях, в той же МСВЦ
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33922055
raven_unix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо Вам пересмотреть структуру классов, программы,
чтобы не надо было использовать указатели на методы.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33922067
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Карабас Барабас AkhКак в Борланде
хочешь как в бормане, в нём и пиши :)

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

У меня модули, кои являются классами. А они пользуют утилиты разные, тоже мной написанные, типа, таймер, поток,... которые вызывают каллбаки. Так вот эти каллбаки, должны являться методами моих классов.
То бишь:
1. Утилиты ничего не знают про классы, они лишь могут знать, что метод какого-то класса надо вызывать.
2. Любой модуль реализован ввиде класса и добавлять к модулю отдельную функцию очень не хочется. Использовать статик, не хорошо, но приходится.

Надо сделать как-то покрасивши.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33922102
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Карабас Барабас raven_unix
ru> Не позоляет С++ так делать.
ru> А жаль.
Моё ИМХО состоит в том, что должна быть возможность и в других реализациях, в той же МСВЦ


Это моя надежда. :)

Но мне, собственно говоря, надо чтобы это реализовалось по стандарту, во первых компилятор gcc, а во вторых, чтобы на все случаи жизни.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33922120
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Появилась одна мысль! Может сделать как в жабе? Timer и TimerTask? Здесь не будет проблем с С++?
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33922127
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может можно завести общий класс-предок ?
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33922174
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Карабас БарабасМожет можно завести общий класс-предок ?

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

Сейчас мне кажется, что мой вариант, единственно возможный, тем более, что при вызове каллбака, хорошим стилем является указание, к чему этот класс относится; если я не ошибаюсь, этим и ялвяется Sender в борланде (как билдер, так и делфя).
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33922188
raven_unix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не очень в java, не знаю структуру их классов

Вообще можно сделать так: создать абстрактный класс (интерфейс), где перечислить все методы, которые Вам нужно вызывать.
После этого надо сделать все необходимые классы наследниками этого интерфейса.
После этого в функции тип параметра будет указатель на этот интерфейс.
И все.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33922266
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
raven_unixЯ не очень в java, не знаю структуру их классов

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

Мне кажется, что мы имеем ввиду одно и тоже. Получается что-то, вроде этого:

Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
//timer
class TimerTask {
   public:
       virtual void timeout(void *param) =  0 ;
}

class Timer {
   public:
       int start(TimerTask *_tt, void *param, int sec, int usec, bool one=false);
}

...

//program
class TimerRegister public TimerTask {
   public:
       virtual void timeout(void *param) {
            MainClass *mc=(MainClass *)param;
  
            mc->...
            ....
       };
}

class MainClass{
      TimerRegister *timerRegister;
      Timer *timer;
   public:
      MainClass() {
          timer = newTimer;
          timer->start(timerRegister, this,  1 ,  1 );
      }
}


Минус подхода - приходится создавать еще один класс, т.е. функция обработки таймаута, находится в другом классе. Не знаю пока, как это расценивать с точки зрения подхода
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33922313
raven_unix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да точно, так я и думал.

Не вижу минусов.
Всего лишь создать абстрактный класс.
Код классов менять даже не придется (только сделать их наследниками этого класса).
Мне кажется, самый удобный подход.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #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
Почему нельзя передавать параметром метод класса?
    #33925464
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всё равно даже в случае полного хаоса класс, предоставляющий регистрацию лисенера должен наследовать соотв. интерфейс, скажем, EventProvider, а класс, регистрирующий коллбак наследует интерфейс EventListener и всё.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33925470
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo Akhа) Сейчас обсуждается, общая задача:
а1) Утилита, производящая вызов каллбака задачи
а2) Задача, котороя хотит зарегестирировать каллбаком свой метод.ну. Давно решённая задача. Чем тебя не устраивают обработчики событий?
AkhБыло предложено 3 метода решения! Это к какому?приведение типов.

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

2. А куда это втыкается? ;)
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33925483
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo AkhВозмьмем ваш пример, в качестве основы. Вроде бы он подходит. Так вот, допустим вамему объекту, созданному по классу, дочернему к некоторому классу с функцией Run, надо заюзать несколько таких потоковых объектов. В этом случае вы создаете 2 этих объекта и каждому кидаете свою функцию Run.хмм... так у тебя всё-таки утилита вызывает задачу или куча классов вызывают друг друга как хотят? Зачем такой хаос может понадобиться?

Утилиты вызывает задачу. Общий случай: задача подключает 40 объектов одного класса, 30 другого и так далее.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33925504
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoвсё равно даже в случае полного хаоса класс, предоставляющий регистрацию лисенера должен наследовать соотв. интерфейс, скажем, EventProvider, а класс, регистрирующий коллбак наследует интерфейс EventListener и всё.

Начинаю склоняться в эту сторону (интерфейсов).... Необходимо правельно проэктировать основной класс. Допустим класс собака, существует не просто как класс, а содержит еще классы. 1-я нога, 2-я нога, которые можно пронаследовать от интерфейса таймера, который будет двигать эти ного.

Вообщем, что-то в этом роде.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33925855
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дадут вам сторонюю библиотеку и скажут что надо к вашим таймерам прицепить. А там 100 классов, да еще с наследованием. Ну и как не устанем к интерфейсу таймера их подключать?
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33925902
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedДадут вам сторонюю библиотеку и скажут что надо к вашим таймерам прицепить. А там 100 классов, да еще с наследованием. Ну и как не устанем к интерфейсу таймера их подключать?

Предлагаем какой-то метод, который подойдет для всех интерфейсов? ;)
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33926154
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А чем плохо с шаюлонным start? Там ежели подумать то и указатель на функцию можно пихнуть
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33927356
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhНаследовать мышь от кота тоже не хорошо.никто и не просит. Наследуй их от мохнатого четвероногого жывотного.

Akh2. А куда это втыкается? ;)ну у тебя же проблемы были с приведением типов. Ладно, забей, всё равно это ересью было.

AkhУтилиты вызывает задачу. Общий случай: задача подключает 40 объектов одного класса, 30 другого и так далее.а проблема в чём? Утилиту с задачей связать или кучу классов с задачей?

AkhНачинаю склоняться в эту сторону (интерфейсов).... Необходимо правельно проэктировать основной класс. Допустим класс собака, существует не просто как класс, а содержит еще классы. 1-я нога, 2-я нога, которые можно пронаследовать от интерфейса таймера, который будет двигать эти ного.уже лучше. А зачем тут таймер?
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33927411
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ага... кажется, понял... ты хочешь регистрировать в таймере произвольные методы объектов для выполнения по таймауту? Хмм... точно не знаю... в мфц это делается, кажется, с помощью костылей. Насчёт qt не знаю.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33927610
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В мфц я что-то вообще не нашёл класса таймера :)
В спп.нет обработчик коннектится через делегат :) (если метод нестатический, указывается объект, к которому применять метод).
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33927833
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мужики! А меня что игнорируют или просто не заметили (там на 2ой странице)
Дернул же не знаю что, не знаю у кого, да еще м неизвестным аргументом. Ежели это не устраивает, то можно из Alexandresku (БИБЛИОТЕЧКА LOKI) взять Functor и перепереть под эту задачку.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33928419
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скольких, однако, трудов стоит написать на спп жалкое подобие делегата :)
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33928429
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo
не наезжай на великий и могучий
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33928570
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoскольких, однако, трудов стоит написать на спп жалкое подобие делегата :)

По сравнению с функтором Александреску C# делегаты глюкавое убожество
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33928577
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoскольких, однако, трудов стоит написать на спп жалкое подобие делегата :)

и трудов там не меньше, M$ их просто спрятало. ILDasm покажет где ;)
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33928856
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хмм... о чём это ты? Мне ildasm весьма красиво пишет.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33928949
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoхмм... о чём это ты? Мне ildasm весьма красиво пишет.

красиво. и немного ПОДРОБНЕЕ чем в исходнике на C#
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33929047
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да, подробнее, но всё делается именно так, как предполагается. И нет приведений типов, как в стихах blinded.
А знаешь, что происходит, когда вызывается тот метод Timer::start ? В курсе, что этот метод будет размножаться?
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33929469
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoНу да, подробнее, но всё делается именно так, как предполагается. И нет приведений типов, как в стихах blinded.

Где я тип привел? Обижаете. Ни одного оператора приведения НЕТ!!!
maXmo
А знаешь, что происходит, когда вызывается тот метод Timer::start ? В курсе, что этот метод будет размножаться?
Ну и пусть компилер размножает, он железный. Зато я не стану машинисткой. И никто не заставит меня наследоваться от одного класса и без числа приводить типы.
А что касается славной библиотеки им Alexandresku, то она не даром так называется (вспомним к/ф Маска) Ежеди кто в ней найдет multithread модель под UNIX скажите
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33930544
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот вам новый опус(на скрепке)
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33930690
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoВ курсе, что этот метод будет размножаться?

в курсе ты действительно думаешь что это так сложно сделать на C++ ???
по мне так это ДЕШОФКА.

авторЕжеди кто в ней найдет multithread модель под UNIX скажите

а руки то тебе на что ???
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33930749
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan)

в курсе ты действительно думаешь что это так сложно сделать на C++ ???
по мне так это ДЕШОФКА.

А я на лавры Гомера не претендую. так Агния Барто. Но в отличии от великих теоретиков, ежели и выеживаюсь, так аргументировано.

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

Линк, плиз.

ПС от автора топика :) : Сейчас не могу участвовать в дискусии, так как нет времени, а для участия мне надо ДУМАТЬ (т.к. этой темой не занималя, даже не знал, что можно функции каласса передовать в параметры).

ПС 2: Если прийдете к конструктивным решениям, буду очень рад.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33931465
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh, с Александреску все просто незабвенный Modern C++ design там целая глава посвящена функторам. Loki лежит здесь http://www.awl.com/cseng/titles/0-201-70431-5
но не факт что g++ сжует без приложения усилий с вашей стороны
А передача метода класса в качестве параметра на самом деле основана на трюке с определением оператора () у вспомогательного класса. Внешне это выглядит как вызов функции, хотя таковым не является.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33931803
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedежели и выеживаюсь, так аргументировано.


Типа наезд ? Ой спасиба, парадавал
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33938063
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedГде я тип привел? Обижаете. Ни одного оператора приведения НЕТ!!!ну было такое:
Код: plaintext
1.
2.
// Пришлость явно инстанциировать, иначе cerr юудет передаваться
// как ostream, а y ios_base конструктор копирования в private
tm.start<Func2, ostream&>(Func2(a, &A::dump), cerr, timeout);
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33938462
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedВот вам новый опус(на скрепке)что-то мусор какой-то распаковывается...
От меня вот тоже опус :)
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33938493
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
то есть вот так
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33939503
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo blindedГде я тип привел? Обижаете. Ни одного оператора приведения НЕТ!!!ну было такое:
Код: plaintext
1.
2.
// Пришлость явно инстанциировать, иначе cerr юудет передаваться
// как ostream, а y ios_base конструктор копирования в private
tm.start<Func2, ostream&>(Func2(a, &A::dump), cerr, timeout);

Не, батенька, это не приведение типа, это явная инстанциация!!! две большие разницы. Это я я явно сказал компилятору какой метод я хочу вызвать, потому что он гад такой при неявной подстановке (сам умничал) вызывал
tm.start<Func2, ostream>.
Ну за опус извините, видно загрузился криво, повторяю. Там одно файло поэтому просто gz без tar
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33939743
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoто есть вот так

Это, как мне кажется есть, то, что и надо было. Вообщем, буду юзать в этом виде:
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33940662
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedТам одно файло поэтому просто gz без tarпонятно... Зачем в тар-то запаковано? Да ещё без расширения? В гз ведь можно без тара паковать. Эхх... линуксоиды... Учитесь, мля :)
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33940791
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я по-поводу Делегата.
Все здорово, но есль отдельные недостатки:
1) для подключения сторонних библиотек вме равно приходится писать... В случае моего последнего опуса, ежели продолжить специализацию TimerTaskT параметров эдак до 15(TYPELIST_15). То проблема закравается раз и навсегда, все сводится к декларации переменной нужного типа.
2) Приведение к типу void* и обратно. Может больно ударить, когда хочешь передать наследника вместо папы. Приходится писать конструкцию типа
reinterpret_cast<void*>(static_cast<Parent*>(childPtr))
чтобы потом сделать
reinterpret_cast<Parent*>(voidPtr)
Ужас!!! этоже прочесть нельзя. И не говорите мне что в случае отсутствия множественного наследования все пройдет на ура, не пройдет! Сем налетел лет 6 назад, когда портировался под HP aCC. Забавный компилятор, у него папа в наследнике начинается со смещением в слово. Вот вспотел тогда код шерстить....

PS Я не linuxoid, я unixoid. За своб недолгую я попробовал SCO, Linux, Solaris, HP-UX (risk и ia64) и AIX
PSS Спасибо Akh, чоть кому-то что-то пригодилось...
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33940853
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а зачем нужен reinterpret_cast<void*> ?
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33940890
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
описанная тобой проблема, насколько я знаю, возникает только при приведении типов parent<->child
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33941074
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
class Parent1
{
public:
	int p1;
	Parent1(int p): p1(p){}
};

class Parent2
{
public:
	int p2;
	Parent2(int p): p2(p){}
};

class Child: Parent1,Parent2
{
public:
	int c;
	Child(int pc, int p1, int p2): c(pc), Parent1(p1), Parent2(p2){}
};

void Func(void *obj1, void *obj2)
{
	Parent1 *op1=(Parent1*)obj1;
	Parent2 *op2=(Parent2*)obj2;
	_tprintf(TEXT("p1=%i, p2=%i\n"),op1->p1,op2->p2);
}

int _tmain(int argc, _TCHAR* argv[])
{
	Child *c1=new Child( 1 , 2 , 3 ), *c2=new Child( 7 , 8 , 9 );
	Func((Parent1*)c1, (Parent2*)c1);
	Func((Parent1*)c2, (Parent2*)c2);
}
выводит
Код: plaintext
1.
p1=2, p2=3
p1=8, p2=9
и не надо пугать небезопасными привидениями.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33942384
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, TYPELIST_1(P1) - это макрос? Можно на него глянуть? Как он отреагирует на конструкцию с запятыми?
Код: plaintext
TYPELIST_1(void (*)(int,int))
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33942564
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, уж как в том анекдоте : Обосновал, но припохабнейше...Сейчас буду топтать, но сначала про reinterpret_cast - это привычка, я всегда когда из.в void* его пишу, оно при чтении глаз мозолит сразу видно где гадость...
По-поводу приведения:
1) его можно просто забыть или сознательно не написать. Компилятор вам об этом ничего не скажет. Более того в большинстве случаев это сходит с рук.
Согласитесь что множественное наслдование не часто встречается, а при одинарном большинство компиляторов сгенерят работающий код. Так у меня и было пока aCC не встретился. Сами понимаете мало приятного везде "работает", а на HP нет и отметим нигде в доках ничего о особенностях размещении объкта в памяти нет. Результат - несколько часов дебагере а потом еще куча времени чтобы прошерстить массу кода.
2) Привестись можно "неправильно". Что собственно вы и сделали. Приведение типа в стиле С в С++ - семантический маразм, никогда нельзя быть уверенным что приведется правильно. Не верите мне, отсылаю к гуру Дизайн и эволюция языка С++, там целая глава о приведении типа, вам читать с середины главы.
В нашем конкретном случае вы нарушили права доступа к объекту, наследование то у вас private. А завтра выйдет новая версия библиотеки где автор уберет наследование и заменит его делегированием и вас перестанет работать, а компилятор ничего не скажетю А не првы были вы ибо автор библиотеки ничего с публичным интерфейсом не сделал..
Кстати если бы вы написали static_cast то хороший компилятор поймал бы вас за руку. GCC таким не оказался( у меня 3.2) Пришлось intel доставать, он поймал за руку.
А так я не против void*, просто если можно без него обойтись, надо обходится.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33943013
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedА завтра выйдет новая версия библиотеки где автор уберет наследование и заменит его делегированием и вас перестанет работать, а компилятор ничего не скажет. А не првы были вы ибо автор библиотеки ничего с публичным интерфейсом не сделал.это однозначно смена интерфейса (если в терминах COM). И это уже не относится к первоначально указанной тобой проблеме передачи парента.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33943634
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
интерфейс - это не просто список методов, это вся иерархия классов.

К тому же, если ты на этих шаблонах напишешь библиотеку, тебе придётся поставлять её в сорсах, что влечёт за собой такой момент, что при любом изменении реализации TimerTaskT, тебе придётся перекомпилировать все модули, где он используется, а как ты помнишь, Akh очень не любит это делать.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33943941
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoAkh очень не любит это делать.

Этточно. ;)

PS: в обсуждение не вникал.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33943999
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhPS: в обсуждение не вникал.если нужна мощная защита от дурака, рекомендуют использовать шаблоны вместо void*
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33944012
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на случай, если ломает писать по делегату на каждую сигнатуру.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33944208
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-моему пора завязывать. Решать все равно Akh_у. А тема высосана до дна, пусть лучше Akh еще чего-нибудь спросит у него ъто здорово получается.
...
Рейтинг: 0 / 0
Почему нельзя передавать параметром метод класса?
    #33945953
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedПо-моему пора завязывать. Решать все равно Akh_у. А тема высосана до дна, пусть лучше Akh еще чего-нибудь спросит у него ъто здорово получается.

Вообще, то я уже давно решил как буду делать, сообщений этак 30 назад. Но читать топик интересно. :)

Спрошу, спрошу. Когда вопросы будут.
...
Рейтинг: 0 / 0
94 сообщений из 94, показаны все 4 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Почему нельзя передавать параметром метод класса?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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