вызовь метода класса из С
От: sergey2b ЮАР  
Дата: 09.11.20 15:44
Оценка:
Подскажите пожалуйста как можно передать указатель на метод класса в Си
а потом вызывать этот метод из Си
Re: вызовь метода класса из С
От: ArtDenis Россия  
Дата: 09.11.20 15:56
Оценка: 10 (2) +5
Здравствуйте, sergey2b, Вы писали:

S>Подскажите пожалуйста как можно передать указатель на метод класса в Си

S>а потом вызывать этот метод из Си

Не надо передавать указатель на метод в си. Сделай всё по-старинке через прокси-функцию

// c

typedef void (*cpp_class_method_wrapper)(void* /*cookie*/, int /*argument*/);

void c_fun(cpp_class_method_wrapper fun, void* cookie)
{
    fun(cookie, 42);
}

// cpp

struct MyClass
{
    void method(int value)
    {
        printf("value = %i\n", value);
    }
};

static void cpp_class_method_proxy(void* cookie, int argument)
{
    ((MyClass*)cookie)->method(argument);
}

int main()
{
    MyClass obj;

    c_fun(&cpp_class_method_proxy, &obj);
}


Только вместо ((MyClass*)cookie) надо сделать православный reinterpret_cast ))
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[2]: вызовь метода класса из С
От: sergey2b ЮАР  
Дата: 09.11.20 16:16
Оценка:
У меня нет выбора
Я вынужден использовать чужую с библиотеку
Которая ожидает структуру с указателями на функции
Re[3]: вызовь метода класса из С
От: ArtDenis Россия  
Дата: 09.11.20 16:32
Оценка: +1
Здравствуйте, sergey2b, Вы писали:

S>У меня нет выбора

S>Я вынужден использовать чужую с библиотеку
S>Которая ожидает структуру с указателями на функции

А в чём тогда проблема? Просто передай то, что хочет библиотека
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re: вызовь метода класса из С
От: Patalog Россия  
Дата: 10.11.20 19:29
Оценка: 6 (1)
Здравствуйте, sergey2b, Вы писали:

[]

https://www.codeproject.com/Articles/13601/COM-in-plain-C#VTABLE
Почетный кавалер ордена Совка.
Re: вызовь метода класса из С
От: rg45 СССР  
Дата: 12.11.20 12:24
Оценка: 6 (1) +1
Здравствуйте, sergey2b, Вы писали:

S>Подскажите пожалуйста как можно передать указатель на метод класса в Си

S>а потом вызывать этот метод из Си

Для вызова нестатической функции-члена (метода) класса необходимо иметь указатель на объект класса, для которого вызывается этот метод. Для этого библиотека должна поддерживать передачу кастомного указателя в процедуру обратного вызова. В таком случае задача решается тривиально — кастомный указатель преобразуется в указатель на объект нужного типа, для которого вызывается нужный метод. Без поддержки же со стороны библиотеки нормального решения нет, остаются извращения со статическими переменными с прилагающимся геморроем обеспечения потокобезопасности.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 12.11.2020 12:29 rg45 . Предыдущая версия .
Re[2]: вызовь метода класса из С
От: rg45 СССР  
Дата: 12.11.20 13:32
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>
AD>static void cpp_class_method_proxy(void* cookie, int argument)
AD>{
AD>    ((MyClass*)cookie)->method(argument);
AD>}
AD>


AD>Только вместо ((MyClass*)cookie) надо сделать православный reinterpret_cast ))


Здесь достаточно будет и static_cast. Результат один и тот же, но лучше все же вырабатывать привычку обходиться преобразованием минимальной силы. Тем более, что с reinterpret_cast не все так прямолинейно, как может показаться на первый взгляд: приведение через void* вместо использования reinterpret_cast.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[3]: вызовь метода класса из С
От: σ  
Дата: 12.11.20 13:54
Оценка: 4 (1)
> с reinterpret_cast не все так прямолинейно, как может показаться на первый взгляд: приведение через void* вместо использования reinterpret_cast.

Машинный перевод stackoverflow-а, серьёзно?
Re[4]: вызовь метода класса из С
От: rg45 СССР  
Дата: 12.11.20 14:45
Оценка:
Здравствуйте, σ, Вы писали:

σ>Машинный перевод stackoverflow-а, серьёзно?


Я, походу, должен начать оправдываться. Не знаю только в чем
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[5]: вызовь метода класса из С
От: Максим Россия  
Дата: 13.11.20 08:18
Оценка: 4 (1)
R>Я, походу, должен начать оправдываться. Не знаю только в чем

Сигма, видимо, хотел получить "оригинальную" версию https://stackoverflow.com/questions/1863069/casting-via-void-instead-of-using-reinterpret-cast
Errare humanum est
Re[6]: вызовь метода класса из С
От: rg45 СССР  
Дата: 13.11.20 08:30
Оценка: :)))
Здравствуйте, Максим, Вы писали:

R>>Я, походу, должен начать оправдываться. Не знаю только в чем


М>Сигма, видимо, хотел получить "оригинальную" версию https://stackoverflow.com/questions/1863069/casting-via-void-instead-of-using-reinterpret-cast


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

Ну вот, я уже и оправдываюсь
--
Не можешь достичь желаемого — пожелай достигнутого.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.