Мне нужно обернуть некоторые API-интерфейсы в библиотеке C++ в C. Я делал это в прошлом, используя непрозрачные указатели на объекты класса, extern «C» и т. Д., Как описано here. Однако эта новая библиотека, с которой я имею дело, широко использует ссылки на интеллектуальные указатели. Я не уверен, как сделать обертку в присутствии умных указателей. Например, предположим, что библиотека C++ имеет следующую функцию:Как обернуть функцию C++, которая возвращает интеллектуальный указатель в C?
SmartPointer<MyClass> foo() {
SmartPointer<MyClass> ret(new MyClass); // Create smart pointer ret
ret->DoSomething(); // Do something with ret
return ret;
}
Как я могу обернуть foo()
в C? Очевидно, мне нужен непрозрачный указатель (например, void*
или пустой указатель struct), который я могу использовать в функции C для ссылки на объект MyClass
. Первый вариант, о котором я думал, состоял в том, чтобы извлечь объект MyClass
из ret
и бросить его в void*
. Тем не менее, этот void*
станет свисающим, как только ret
выходит за пределы области действия из-за автоматического удаления, сделанного с помощью умного указателя (исправьте меня, если я ошибаюсь).
Другой вариант заключается в выделении указатель на смарт-указатель (скажем retPtr
), делать *retPtr=ret
, а затем создать непрозрачный указатель на retPtr
. Я думаю, что этот вариант может работать, но лучший ли это?
Любая помощь приветствуется.
Я согласен с вашим последним предложением. –
Какой умный указатель, я не знаю класса SmartPointer в stdlib. Это сильно зависит от семантики рассматриваемого умного указателя ... – Vality
действительно ли библиотеке C требуется доступ к элементам 'ObjectType'? или он просто удерживает указатель на некоторое время и освобождает его позже? Также какова связь между «ObjectType» и «MyClass»? –