|
Непонятный typedef |
|
|
|
Oct 15 2009, 11:30
|
Местный
  
Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846

|
Столкнулся вот с таким переопределением типа: Код typedef void (* sys_timeout_handler)(void *arg); (Это из стека lwIP) И никак не могу понять, что же из себя представляет переменная h, объявленная как Код sys_timeout_handler h; Буду признателен за подсказку.
--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
|
|
|
|
|
 |
Ответов
|
Oct 16 2009, 03:52
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(GetSmart @ Oct 15 2009, 20:42)  Процедуры и функции и прочее - это алгоритмические еденицы. Они есть везде, где есть алгоритмы. Да? А вот в языке Verilog, например, есть function и task, процедуров не завезли.  Как быть? Нет в языке С процедур. Есть только функции. Это вопрос о терминах. Если хотите, чтобы вас однозначно понимали в какой-то предметной области, будьте добры корректно употреблять легальные устоявшиеся термины. В языке программирования С нет процедур. И в языке программирования С++ нет процедур. В нем же функции-члены классов - это функции члены классов, а не методы, как их многие называют. Методы в С++ - это виртуальные функции. В другом языке, возможно, корректно называть любые функции-члены методами. Но не в С++. Когда я вижу в контексте С++ слово метод, у меня сразу включается восприятие полиморфного поведения данной функции. И очень неприятно потом узнавать, что это была обычная функция-член. Некорректное употребление терминологии - источник для путаницы. И замечание было сделано совершенно уместно. Цитата(GetSmart @ Oct 15 2009, 20:42)  Видимо проблема растёт из "нового" образования в школах/вузах. Раньше, когда в обязательном порядке изучали Паскаль ни у кого бы не возникло отторжение понятия процедуры. Проблема растет из недостаточного знания матчасти и/или небрежного отношения мелочам. И это зря. "Профессионал отличается от любителя отработкой мелочей" (с).
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Oct 16 2009, 08:43
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(AHTOXA @ Oct 16 2009, 14:57)  Первый раз слышу о таком разделении. Где такое прописано? Терминология идет, как уже было сказано, с ООП языков, но там проще в этом смысле - там все функции объектов являются методами. Что касается С++, то про упомянутое, в частности, есть фраза Б.Страуструпа (The C++ Programming Language, Third Edition by Bjarne Stroustrup. Copyright ©1997 by AT&T. Published by Addison Wesley Longman, Inc. ISBN 0-201-88954-4., 12.2.6 Virtual Functions): To allow a virtual function declaration to act as an interface to functions defined in derived classes, the argument types specified for a function in a derived class cannot differ from the argu- ment types declared in the base, and only very slight changes are allowed for the return type (§15.6.2). A virtual member function is sometimes called a method.A virtual function must be defined for the class in which it is first declared (unless it is declared to be a pure virtual function; see §12.3). Думается, Страуструп является авторитетным дяденькой в контексте С++, и он тут не оригинальничает - следует общепринятому подходу. Да, и по смыслу метод - это переопределенное (т.е. измененное в наследниках) действие объекта, и таким свойством обладает как раз (и только) виртуальная функция в С++. А в чистых ООП языках ничего кроме методов и нет.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Oct 16 2009, 09:12
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Ясно, спасибо. Замечу всё же, что "иногда называют методом" - это весьма нестрого, и не тянет на строгое терминологическое определение  ----- Я тут ещё вот что подумал... Цитата(dxp @ Oct 16 2009, 14:43)  Да, и по смыслу метод - это переопределенное (т.е. измененное в наследниках) действие объекта Это ведь чисто умозрительно. Если уж речь идёт о точной терминологии, то надо оперировать какими-то более весомыми определениями, чем "по смыслу". Я, например, не нашёл указаний, что метод должен быть обязательно переопределяем. Вот например, из википедии: Цитата Метод в объектно-ориентированном программировании - это функция, принадлежащая какому-то классу или объекту. Никаких намёков на переопределяемость.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Oct 16 2009, 10:09
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(AHTOXA @ Oct 16 2009, 16:12)  Ясно, спасибо. Замечу всё же, что "иногда называют методом" - это весьма нестрого, и не тянет на строгое терминологическое определение  Он просто упомянул о том, что виртуальная функция - это то, что называют методом в ООП. Метод - это термин из ООП. Если пройтись по его книге, то слово method там встречается еще не раз, но всегда в ином смысле - как способ. Как обозначение простой функции-члена этот термин не применяется. Это устоявшаяся терминология, и разумно ее придерживаться. Цитата(AHTOXA @ Oct 16 2009, 16:12)  Я тут ещё вот что подумал... Это ведь чисто умозрительно. Если уж речь идёт о точной терминологии, то надо оперировать какими-то более весомыми определениями, чем "по смыслу". Я, например, не нашёл указаний, что метод должен быть обязательно переопределяем. Вот например, из википедии: Никаких намёков на переопределяемость. Ключевое словосочетание: "в объектно-ориентированном программировании". Т.е. задан контекст. В ООП все функции являются переопределяемыми (виртуальными), поэтому нет смысла это специально выделять. А С++ - язык гибридный, в нем сочетаются несколько парадигм программирования, в нем есть и обычные функции, и виртуальные, кои являются методами по ООП терминологии. А путаница возникает оттого, что некоторые люди, не задумываясь, переносят терминологию из ООП на другие парадигмы - в частности, в С++ - на объектную (классы, объекты классов).
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Oct 16 2009, 10:20
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(dxp @ Oct 16 2009, 16:09)  Ключевое словосочетание: "в объектно-ориентированном программировании". Т.е. задан контекст. Хорошо, почти убедил  Осталось развеять мои сомнения только вот в этом: Цитата(dxp @ Oct 16 2009, 16:09)  В ООП все функции являются переопределяемыми (виртуальными) Откуда это следует? ЗЫ. Я не спорю, я действительно хочу разобраться. Потому что у меня слово "метод" совершенно не ассоциируется с виртуальностью.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Oct 16 2009, 13:41
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(AHTOXA @ Oct 16 2009, 17:20)  Откуда это следует? А что по-твоему ООП?  Чем объектно-ориентированный подход отличается от объектного? Объектный - это когда ты вместо разрозненных данных и кода используешь законченные сущности - объекты, имеющие представление (закрытую часть, ядро которой представляют данные) и интерфейс (открытую часть, состоящую, обычно, из функций-членов). Интерфейс определяет то, что можно делать с объектом. Т.е. программист на этапе проектирования объекта задает его поведенческую модель, изменить которую при использовании объекта нельзя - в этом суть объектного подхода и его главные свойства: инкапсуляция и абстракция. Объектно-ориентированный подход - это когда на основе объектов строят иерархию, состоящую из объектов-предков и объектов-потомков, имеющих переопределяемые функции, поведение которых в потомках задается в соответствии с логикой работы объекта-потомка. И эта переопределяемость позволяет использовать общий интерфейс для управления объектами из этой иерархии. Классический пример - графика. Вот есть полсотни объектов, которые имеют в качестве общего свойства то, что их можно нарисовать - в силу того, что они графические объекты. Поэтому все они имеют переопределяемую в потомках (виртуальную) функцию draw(). Теперь, чтобы нарисовать их все, достаточно пройтись по массиву указателей (в С++) на базовый класс (на тот класс, в котором эта функция draw определена впервые), вызывая для каждого эту функцию. И для каждого объекта будет вызвана его собственная функция. Т.е. код, вызывающий функцию, один и тот же, а функции вызываются каждый раз разные. И без ошибок. Т.е. ООП - это очень эффективный способ управления множеством объектов, связанных между собой "родственными связями", когда известно, что можно делать, но неизвестно в общем случае как (это "как" в каждом случае свое). И по терминологии ООП это что обзывается термином "метод". Другими словами, у каждого объекта есть одинаковое по смыслу действие, но способ его реализации в каждом случае разный. Способ == метод. Отсюда и происхождение этого термина. Т.е. у этих "родственных" объектов есть общее, отличающееся по способу/методу реализации. А вот у просто объектов, не связанных "родственными" связями, такого общего свойства нет. У них в общем случае все функции совершенно разные по смыслу, т.е. это не методы реализации одного и того же по целевому смыслу, а просто функции. Поэтому называть их методами некорректно во всех смыслах. В чистых же ООП языках все объекты являются связанными, в них все функции-члены реализуются как переопределяемые, т.е. являются как раз методами реализации одних и тех же (по целевому смыслу) действий. Цитата(GetSmart @ Oct 16 2009, 20:29)  Введите в гугле "процедуры в языке си" и зачитайтесь  Особенно первой ссылкой http://www.codenet.ru/progr/cpp/qc/Это лишь доказывает, что вы не один попали под влияние Паскаля.  К тому же, надо делать скидку, что переводы тоже делают люди. Не случайно А.С.Пушкин называл переводчиков "подставными лошадьми истории".  Ну, и в конце концов, мало ли что пишут на заборах. Мы тут серьезно разговариваем, т.ч. давайте апеллировать к серьезным источникам, коими являются Стандарт языка и его автор[ы].
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Oct 16 2009, 15:44
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(dxp @ Oct 16 2009, 19:41)  Т.е. ООП - это очень эффективный способ управления множеством объектов, связанных между собой "родственными связями", когда известно, что можно делать, но неизвестно в общем случае как (это "как" в каждом случае свое). И по терминологии ООП это что обзывается термином "метод". Другими словами, у каждого объекта есть одинаковое по смыслу действие, но способ его реализации в каждом случае разный. Способ == метод. Отсюда и происхождение этого термина. Всё равно не вижу тождества "метод == виртуальный"  В той же графике, метод move(x, y), например, вполне может быть одинаков для всех фигур, и состоять из Код { erase(); set_pos(x, y); draw(); } , и потому ему совершенно необязательно быть виртуальным. То есть, (имхо), метод = действие объекта, виртуальный = переопределяемое действие объекта. И эти вещи более или менее ортогональны. Поэтому я всё же склоняюсь к мысли, что название "метод" - это просто краткий способ назвать функцию класса. Ещё более в этом мнении меня утверждает существование термина "Виртуальный метод". Раз есть "виртуальный", то, наверное, должен быть и просто метод?  Цитата(dxp @ Oct 16 2009, 19:41)  Т.е. у этих "родственных" объектов есть общее, отличающееся по способу/методу реализации. А вот у просто объектов, не связанных "родственными" связями, такого общего свойства нет. У них в общем случае все функции совершенно разные по смыслу, т.е. это не методы реализации одного и того же по целевому смыслу, а просто функции. Поэтому называть их методами некорректно во всех смыслах. А, я наконец понял, откуда идёт эта аналогия. Метод = метод (вариант) реализации? Понятно. Но всё же не соглашусь. Метод - это функция объекта, независимо от того, есть у объекта родственные связи или нет. Единственный вариант(метод) реализации - тоже вариант (метод)  )
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Oct 16 2009, 21:20
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(AHTOXA @ Oct 16 2009, 21:44)  Всё равно не вижу тождества "метод == виртуальный"  Решил таки копнуть поглубже  Поискал по имеющимся книжкам. 1. Bruce Eckel - "Thinking in C++", Глава 10, задание 28: Цитата Write static methods to print out the arrays. - статический, следовательно - невиртуальный, но метод. Там же, Глава 16: Цитата container class has the begin( ) and end( ) methods to produce these iterators. - при этом из приведённого исходника видно, что ни begin() ни end() - не виртуальные. 2. Dale N. - "C++ plus data structures (3rd edition) (2003)", глоссарий: Цитата method: a function declared as member of class object - ни слова о виртуальности. 3. "Design Patterns": Цитата Object-oriented programs are made up of objects. An object packages both data and the procedures that operate on that data. The procedures are typically called methods or operations. - тоже никакого обособления виртуальных методов. 4. Ален Голуб - "Верёвка достаточной длины": Цитата 97. Наследование - это процесс добавления полей данных и методов-членов. В Си++ производный класс может рассматриваться как механизм добавления полей данных и обработчиков сообщений к существующему определению класса - к базовому классу. (Вы можете также смотреть на наследование как на средство изменения поведения объекта базового класса при получении им конкретного сообщения. Я вернусь к такой точке зрения при обсуждении виртуальных функций). В таком случае иерархия классов является просто средством представления полей данных и методов, определяемых для конкретного объекта. Объект содержит все данные и методы, объявленные на его уровне, а также на всех вышележащих уровнях. - и далее многократно по тексту употребляется слово "метод" в контексте "функция-член". То есть, похоже, что разделение "виртуальные функции-члены = методы, невиртуальные = просто функции-члены" - не является общепринятой терминологией. Хотя идея неплохая
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
Сообщений в этой теме
Harvester Непонятный typedef Oct 15 2009, 11:30 GetSmart Цитата(Harvester @ Oct 15 2009, 17:30) И ... Oct 15 2009, 11:33 Harvester Цитата(GetSmart @ Oct 15 2009, 14:33) Под... Oct 15 2009, 11:47 andrew_b Цитата(GetSmart @ Oct 15 2009, 15:33) h -... Oct 15 2009, 11:50  GetSmart Цитата(andrew_b @ Oct 15 2009, 17:50) На ... Oct 15 2009, 11:52   andrew_b Цитата(GetSmart @ Oct 15 2009, 15:52) про... Oct 15 2009, 12:04    kurtis Цитата(andrew_b @ Oct 15 2009, 15:04) В... Oct 15 2009, 12:08    GetSmart Цитата(andrew_b @ Oct 15 2009, 18:04) В... Oct 15 2009, 12:10     andrew_b Цитата(GetSmart @ Oct 15 2009, 16:10) Не ... Oct 15 2009, 12:36      GetSmart Цитата(andrew_b @ Oct 15 2009, 18:36) К ч... Oct 15 2009, 13:07       andrew_b Цитата(GetSmart @ Oct 15 2009, 17:07) Дор... Oct 15 2009, 13:23        demiurg_spb Цитата(andrew_b @ Oct 15 2009, 17:23) Реч... Oct 15 2009, 16:03 kurtis Цитата(Harvester @ Oct 15 2009, 14:30) Ст... Oct 15 2009, 11:52 Flexz Давным-давно в паскале процедурой называлась функц... Oct 15 2009, 12:12 zltigo Цитата(Flexz @ Oct 15 2009, 15:12) Давным... Oct 15 2009, 12:31 sigmaN Да все знают. И ответ топикстартеру был понятен.
П... Oct 15 2009, 12:55 _Pasha Цитата(sigmaN @ Oct 15 2009, 15:55) Да вс... Oct 15 2009, 15:12  GetSmart Цитата(_Pasha @ Oct 15 2009, 21:12) Кодvo... Oct 16 2009, 21:20         dxp Цитата(AHTOXA @ Oct 16 2009, 22:44) Всё р... Oct 17 2009, 05:31          AHTOXA Цитата(dxp @ Oct 17 2009, 11:31) Если он ... Oct 17 2009, 08:49           dxp Цитата(AHTOXA @ Oct 17 2009, 15:49) Если ... Oct 17 2009, 12:46            AHTOXA Цитата(dxp @ Oct 17 2009, 18:46) P.S. Что... Oct 17 2009, 14:14  GetSmart Цитата(dxp @ Oct 16 2009, 09:52) Да? А во... Oct 16 2009, 10:15   dxp Цитата(GetSmart @ Oct 16 2009, 17:15) Под... Oct 16 2009, 13:08    GetSmart Цитата(dxp @ Oct 16 2009, 19:08) А где на... Oct 16 2009, 13:29    GetSmart Цитата(dxp @ Oct 16 2009, 19:08) Речь не ... Oct 16 2009, 14:29     _Pasha Цитата(GetSmart @ Oct 16 2009, 17:29) Это... Oct 16 2009, 19:18 GetSmart Дайте _Pashе медаль. И ещё одну, за занудство Oct 15 2009, 15:22 ARV имхо, профессионалу наплевать, как обозвать структ... Oct 16 2009, 04:33 dxp Цитата(ARV @ Oct 16 2009, 11:33) имхо, пр... Oct 16 2009, 06:24  GetSmart Цитата(dxp @ Oct 16 2009, 12:24) Угу. Дав... Oct 16 2009, 10:24 GetSmart Спрашивается - зачем так настойчиво выяснять разли... Oct 18 2009, 03:17 dxp Цитата(GetSmart @ Oct 18 2009, 10:17) Спр... Oct 18 2009, 04:07  GetSmart Цитата(dxp @ Oct 18 2009, 10:07) Путаница... Oct 18 2009, 06:32
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|