powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Oпределить процедурный тип для класса
21 сообщений из 21, страница 1 из 1
Oпределить процедурный тип для класса
    #39602785
Kiril
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может ли C ++ определить процедурный тип для класса, как в Delphi (добавляет ключевое слово объекта после процедурного типа).
Например:
тип
Код: pascal
1.
2.
3.
4.
   Объект TNotifyEvent = procedure (отправитель: TObject);

var
   OnClick: TNotifyEvent;


Как это сделать в C ++.
...
Рейтинг: 0 / 0
Oпределить процедурный тип для класса
    #39602791
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kiril,

указатель на член класса
...
Рейтинг: 0 / 0
Oпределить процедурный тип для класса
    #39602854
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kiril, не надо изобретать велосипед! Всё это уже есть в Embarcadero C++ Builder. Смотрите заголовочные файлы и RTFM.
...
Рейтинг: 0 / 0
Oпределить процедурный тип для класса
    #39602938
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KirilКак это сделать в C ++.

В стандартном С++ - никак. У boost есть пара уродливых темплейтов на этот случай.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Oпределить процедурный тип для класса
    #39602944
Kiril
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Спасиба.

Я знаю, как это сделать в C ++ Builder и Delphi. Но я хочу знать, как это делается на C ++.
На переменной в обекте на которым, назначат нестатические методы наследникам и вызваю это методами через переменной обекте.
То есть, я хочу это сделать, то же самое, что и обработчики событий в Delphi и C ++ Builder.

Как это сделать в C ++.
...
Рейтинг: 0 / 0
Oпределить процедурный тип для класса
    #39602975
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kirilтип
Объект TNotifyEvent = procedure (отправитель: TObject);

var
OnClick: TNotifyEvent;

Как это сделать в C ++.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
// C++11
#include <functional>

using TNotifyEvent = std::function<void(TObject sender)>;

class A {
    TNotifyEvent OnClick {std::bind(&A::handle_click, this, std::placeholders::_1)};
    void handle_click(TObject sender) {}
};
...
Рейтинг: 0 / 0
Oпределить процедурный тип для класса
    #39603097
Kiril
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky,

Я все понял.
То, что я хочу делать с инструментами C ++, не очень эффективно и нужно искать другие способы, если это возможно.
Если я должен сделать это, как Delphi (C ++ Builder), используя указатель на член класса , я должен написать класс(delegate), содержащий указатель на объект, и указатель метода этого объекта, который я хочу вызвать.
Код: plaintext
1.
2.
3.
4.
5.
   TMethod = class
     void Obj; // Указатель на объект
     void * Method; // Указатель на объект метода
      ......
   end;


Или использовать <functional> , что не очень эффективно.
Спасиба.
...
Рейтинг: 0 / 0
Oпределить процедурный тип для класса
    #39603241
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kiril,

Это для обработки OnClick вам не хватает эффективности?
...
Рейтинг: 0 / 0
Oпределить процедурный тип для класса
    #39603270
Kiril
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky,

Да этот пример эффективен.
Но я хочу перевести код, написанный на C ++ Builder, где эти методы класы могут часто менятся програмно.
Класы написанный на C ++ Builder, не может легко переделать на C++.

Мне придется изменить параметры некоторых методов этих классов(есть много изменений). Так что теперь я думаю, как вообще избавиться от указателей на методы. Сейчас я ищу другое стандартное решение, который, не основанны на Object Pascal.
...
Рейтинг: 0 / 0
Oпределить процедурный тип для класса
    #39603765
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KirilМожет ли C ++ определить процедурный тип для класса, как в Delphi (добавляет ключевое слово объекта после процедурного типа).
Например:
тип
Объект TNotifyEvent = procedure (отправитель: TObject);

var
OnClick: TNotifyEvent;

Как это сделать в C ++.

Указатель на функцию.

Код: plaintext
1.
2.
3.
typedef void (*TNotifyEvent) ( TObject *sender );

TNotifyEvent onClick = someFunc;
...
Рейтинг: 0 / 0
Oпределить процедурный тип для класса
    #39603818
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivУказатель на функцию.

Почувствуй разницу между "указателем на функцию" и "указателем на метод объекта (даже не
класса)".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Oпределить процедурный тип для класса
    #39603861
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov.... "указателем на метод объекта (даже не класса)".Эмм, а это еще что такое ? В терминах С++ пжлст
...
Рейтинг: 0 / 0
Oпределить процедурный тип для класса
    #39604055
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovMasterZivУказатель на функцию.

Почувствуй разницу между "указателем на функцию" и "указателем на метод объекта (даже не
класса)".


Где там указатель на метод ?
...
Рейтинг: 0 / 0
Oпределить процедурный тип для класса
    #39604495
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А лямбды для решения проблемы не подойдут? По-моему, отлично подходят.
...
Рейтинг: 0 / 0
Oпределить процедурный тип для класса
    #39604514
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KirilAnatoly Moskovsky,

Да этот пример эффективен.
Но я хочу перевести код, написанный на C ++ Builder, где эти методы класы могут часто менятся програмно.
Класы написанный на C ++ Builder, не может легко переделать на C++.

Мне придется изменить параметры некоторых методов этих классов(есть много изменений). Так что теперь я думаю, как вообще избавиться от указателей на методы. Сейчас я ищу другое стандартное решение, который, не основанны на Object Pascal.
Мне кажется ты капризничаешь. Обычные возможности ООП покрывают
необходимость что-то менять программно. Почитай про шаблон Strategy например.
...
Рейтинг: 0 / 0
Oпределить процедурный тип для класса
    #39605108
Kiril
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,


Код: plaintext
1.
template < class T, void (T::*F)() > class callback {/**/};


The implementation of the template is relatively simple: it has a reference to T, which is the class whose member function is to be called, a constructor and a member function called execute(), which invokes the callback member function:

Код: 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.
template < class T, void (T::*F)() >
class callback
{
public:
 callback(T& t) : object(t) {}   //object
 void execute() {(object.*F)();}//callback function
private:
 T& object;
};

 
class A
{
public:
 void f();
};

 
int main()
{
 A a; 
 callback < A, &A::f > c(a); //instantiate template 
 c.execute(); // call callback member function
}
...
Рейтинг: 0 / 0
Oпределить процедурный тип для класса
    #39605116
д0kХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KirilAnatoly Moskovsky,

Да этот пример эффективен.
Но я хочу перевести код, написанный на C ++ Builder, где эти методы класы могут часто менятся програмно.
Класы написанный на C ++ Builder, не может легко переделать на C++.

Мне придется изменить параметры некоторых методов этих классов(есть много изменений). Так что теперь я думаю, как вообще избавиться от указателей на методы. Сейчас я ищу другое стандартное решение, который, не основанны на Object Pascal.


В данной постановке наверное никак .
Используемый вами ( билдером) патерн без указателей на функции ИМХО не возможен.
Этот патерн краеуголный камень в упралении майкрорсофтовскими окнами,
и виден из любого высокоуровневого иструмента программирования.
...
Рейтинг: 0 / 0
Oпределить процедурный тип для класса
    #39605118
Kiril
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В книге(Новые сложные задачи на C++ Автор: Саттер Г.) есть подробное описание:
Задача 35. Обобщенные обратные вызовы 221
...
Рейтинг: 0 / 0
Oпределить процедурный тип для класса
    #39605125
д0kХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KirilВ книге(Новые сложные задачи на C++ Автор: Саттер Г.) есть подробное описание:
Задача 35. Обобщенные обратные вызовы 221

Kirilгде эти методы класы могут часто менятся програмно.


ИМХО
Вангую
заипетесь изменять кучу класов для небольшой модификации
функционала и вернетесь к указателям.
...
Рейтинг: 0 / 0
Oпределить процедурный тип для класса
    #39605130
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kiril, я не услышал вопроса. Ты кидаешь цитаты из книжки. Мне комментировать их?
Или мне их читать к сведению?
...
Рейтинг: 0 / 0
Oпределить процедурный тип для класса
    #39605148
Kiril
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,

Нет. Я понимаю, что эти классы, написанные на C ++ Bulder, я должен переписать их на стандартном C++ снова.

Димитрий Сибиряков оказался прав. Его ответ:

"Kiril
Как это сделать в C ++.

В стандартном С++ - никак. У boost есть пара уродливых темплейтов на этот случай."

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


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