powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Почему нельзя передавать параметром метод класса?
25 сообщений из 94, страница 1 из 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
25 сообщений из 94, страница 1 из 4
Форумы / C++ [игнор отключен] [закрыт для гостей] / Почему нельзя передавать параметром метод класса?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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