Я использую C и struct
s, где структура может иметь члены, но не функции. Предположим для простоты, что я хочу создать структуру для строк, которые я назвал, str
и я хочу иметь возможность делать, str.replace(int i, char c)
где i
находится индекс строки и c
символ, который заменяет символ в позиции i
. Если бы это никогда не было возможно, так как структуры не могут иметь функции, или есть какой-то способ, которым мы можем реализовать это поведение и имитировать, что структура может иметь (простую) функцию, которая на самом деле является только структурой, копирующей себя в новую структуру и обновляющей ее поля, которые он мог сделать?
Таким образом, replace
может быть третий член структуры, который указывает на новую структуру, которая обновляется при обращении к ней или аналогичной. Это могло быть сделано? Или есть что-то встроенное или какая-то теория или парадигма, которая мешает моему намерению?
Предпосылкой является то, что я пишу код на C и обнаруживаю, что заново изобретаю функции, которые, как я знаю, являются встроенными библиотеками в языках ООП, и что ООП будет хорошим способом манипулирования строками и командами.
источник
str.replace(&str, i, c)
.this
Конечно, C ++ автоматизирует передачу указателя.Ответы:
Ваша функция должна выглядеть следующим образом.
Это принимает указатель на объект для работы в качестве первого параметра. В C ++ это называется
this
-pointer и не требует явного объявления. (Сравните это с Python, где это необходимо.)Чтобы вызвать вашу функцию, вы также должны явно передать этот указатель. По сути, вы торгуете
o.f(…)
синтаксис дляf(&o, …)
синтаксиса. Не так уж и важно.История становится более увлекательной, если вы хотите поддержать полиморфизм (или
virtual
функции). Он также может быть эмулирован в C (я показал это для этого ответа ), но это не очень приятно делать вручную.В качестве прокомментировал Ян Худек , вы также должны сделать привычкой добавлять префикс имени функции к имени типа (то есть
string_replace
), потому что в C нет пространств имен, поэтому может быть только одна названная функцияreplace
.источник
string_replace
, потому что в C тоже нет перегрузки функций, и у вас, скорее всего, есть другиеreplace
для некоторых других типов ...string_replace
. Имена , начинающиеся сstr
,mem
или сwcs
последующим строчной буквой зарезервированы для расширения в будущем.Структуры могут содержать функцию указатели на , но они действительно нужны только для виртуальных методов. Невиртуальные методы в объектно-ориентированном C обычно выполняются путем передачи структуры в качестве первого аргумента обычной функции. Посмотрите на Gobject для хорошего примера OOP-фреймворка для C. Он использует макросы для обработки большого количества шаблонов, необходимых для наследования и полиморфизма.
C был создан 44 года назад. Это очень популярный язык для открытого кода. Вы не первый, кто думает, что стандартные строки C неуклюжи для работы. Сделайте некоторые поиски для строковых библиотек C. Вам не нужно изобретать велосипед.
источник
С помощью указателей функций вы можете сделать:
Как правило, это полезно только в том случае, если реализация может измениться, и в этом случае вы должны использовать vtable, поэтому накладные расходы составляют только один указатель на структуру:
источник
str
(илиmem
илиwcs
) и строчные буквы зарезервированы стандартом C для будущих расширений, поэтому не вызывайте егоstring_replace
.str_replace
Это хорошо.Да, они могут, вроде. Вы можете использовать тот факт, что C позволяет указателям на функциональные блоки в памяти, то есть указателям на функции, и, используя их, вы можете создавать как интерфейсы, такие как полиморфизм, так и виртуальные функции (даже если они не такие красивые).
Я написал сообщение в блоге на эту тему после недавнего вопроса от одного из моих студентов, касающегося интерфейсного кода в C и Go, вы можете прочитать его здесь:
Сообщение в блоге о не OO интерфейсах
Посмотрите, дает ли это вам какие-либо идеи.
Вы также можете просто добавить в свой код свободную функцию и использовать указатель this, что означает, что вы передаете указатель на существующую структуру для работы, как описано в других ответах.
источник