LINUX.ORG.RU

Как подружить Си и объекты?

 , , указатели на объекты


0

2

Здравствуйте.

Появилась необходимость «подружить» процедурный язык Си и объекты. Абстрактный пример: пусть есть некоторый класс в скомпилированной библиотеке (it means, у меня нет доступа к исходному коду). Опишем его в терминах Java-подобного синтаксиса:

public class SomeClass
{
   public int x;                  //Поле целого класса
   public SomeClass()             //Конструктор класса
   {
      ...
   }
   public int SomeMetod(int y)    //Метод класса
   {
      ...
   }
}

Если я хочу обратится к x или методу SomeMetod() на том же языке, проблем нет:

SomeClass instant = new SomeClass();
instant.x = 1;
instant.SomeMetod(3);

Как сделать то же самое в терминах языка Си? Указатель ведь может ссылаться на что угодно в памяти.

P.S. В примере не имеется ввиду язык Java. Имеется ввиду компилируемый объектно-ориентированный язык.

Перемещено beastie из general

через промежуточную библиотеку с внешнедоступными функциями-обертками + функция создания объекта и функция удаления объекта.

Atlant ★★★★★
()

Написать обертку для экспортирования C-интерфейса?

kamre ★★★
()

для java: есть JNI, в нем есть соответствующие средства.

для objc: слышал что есть аналогичное java.

для C++: готового нет, и реализовать трудно будет. проще на том же C++ написать сишную обертку, и дергать уже ее.

waker ★★★★★
()

Появилась необходимость «подружить» процедурный язык Си и объекты.

Си замечательно дружит с объектами и ничто не мешает использовать в нём ООП. Другой вопрос в том, что у него нет встроенных средств для ООП.

SomeClass instant = new SomeClass();
instant.x = 1;
instant.SomeMetod(3);

Как сделать то же самое в терминах языка Си? Указатель ведь может ссылаться на что угодно в памяти.

struct SomeClass *instant = malloc(sizeof(*instant));
SomeClass_Constructor(instant);
instant->x = 1;
SomeClass_SomeMethod(instant, 3);
  • Наследование -> добавление структуры предка первым элементом новой структуры;
  • виртуальные функции -> указатели на функции;
  • this передаётся явно.

Но как уже написали выше, тебе нужно будет написать свою обёртку для этого. Или попробовать найти какой-нибудь готовый генератор обёрток.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от buddhist

Да вот и нет, деструктор запросто можно сделать приватным.

Gorthauer ★★★★★
()
Ответ на: комментарий от buddhist

но там все правильно сказал

Ты издеваешься? Исключения в конструкторе гарантировано ведут к утечкам памяти?

Не спорю, многое по делу, но большинство притянуто за уши либо очень спорно.

nanoolinux ★★★★
()
Ответ на: комментарий от buddhist

Лавсан это Лавсан, конечно, но там все правильно сказал.

Там по делу ни одного пункта нету. Треть пунктов — мнение, ещё треть — полный абсурд, вроде желания иметь убогий finally при наличии отменного RAII или жалоб на существование friend, а оставшееся суть 4.2.

quiet_readonly ★★★★
()

В случае C++ можно сделать так, как сделали авторы clang или авторы assimp. В clang есть высокоуровневый API clang-c, сделанный на C. В assimp методы закрыты проверкой на макрос __cplusplus, а поля класса наоборот открыты, если __cplusplus не объявлен.

quiet_readonly ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.