Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Почему нельзя передавать параметром метод класса? / 25 сообщений из 94, страница 1 из 4
16.08.2006, 13:00
    #33921384
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему нельзя передавать параметром метод класса?
На счет статического понятно - можно, а вот, обычный метод, почему нельзя? Даже, если прописать объект, которому он пренадлежит?

Типа такого:

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

a::a() {
    func1(this->f);
}
...
Рейтинг: 0 / 0
16.08.2006, 13:12
    #33921434
Akh
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
16.08.2006, 13:15
    #33921444
raven_unix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему нельзя передавать параметром метод класса?
А объявление func() можно увидеть?
...
Рейтинг: 0 / 0
16.08.2006, 13:26
    #33921507
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему нельзя передавать параметром метод класса?
raven_unixА объявление func() можно увидеть?

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

Но для представления, сейчас выкину листинги
...
Рейтинг: 0 / 0
16.08.2006, 13:29
    #33921521
Akh
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
16.08.2006, 13:34
    #33921555
raven_unix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему нельзя передавать параметром метод класса?
Просто приведение из типа "указатель на метод класса" к типу "указатель на функцию" невозможно.
При вызове метода класса ему всегда передается указатель this.
Если бы возможно приведение к типу "указатель на функцию", то откуда компилятор бы взял указатель this.
...
Рейтинг: 0 / 0
16.08.2006, 13:47
    #33921613
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему нельзя передавать параметром метод класса?
raven_unixПросто приведение из типа "указатель на метод класса" к типу "указатель на функцию" невозможно.
При вызове метода класса ему всегда передается указатель this.
Если бы возможно приведение к типу "указатель на функцию", то откуда компилятор бы взял указатель this.

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

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

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

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

Тогда вопрос - а как это сделать в обычных С++? __closure он не понимает в принципе.
...
Рейтинг: 0 / 0
16.08.2006, 14:49
    #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
16.08.2006, 14:55
    #33921962
Akh
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
16.08.2006, 14:57
    #33921968
Карабас Барабас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему нельзя передавать параметром метод класса?
AkhКак в Борланде
хочешь как в бормане, в нём и пиши :)
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
16.08.2006, 15:05
    #33922012
raven_unix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему нельзя передавать параметром метод класса?
Карабас Барабас AkhКак в Борланде
хочешь как в бормане, в нём и пиши :)

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

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

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

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


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

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

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

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

Вообще можно сделать так: создать абстрактный класс (интерфейс), где перечислить все методы, которые Вам нужно вызывать.
После этого надо сделать все необходимые классы наследниками этого интерфейса.
После этого в функции тип параметра будет указатель на этот интерфейс.
И все.
...
Рейтинг: 0 / 0
16.08.2006, 15:50
    #33922266
Akh
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
16.08.2006, 16:02
    #33922313
raven_unix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему нельзя передавать параметром метод класса?
Да точно, так я и думал.

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


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