Подскажите, пожалуйста — у меня имеется некое C/C++ API. Си-часть у него не совсем Си, потому что, хоть оно и объявлено
extern "C"
, но внутри у него идет C++ код (например, используются ссылки, классы, пространства имен и т. п.; то есть единственное, что там «Си», это сохраненные имена функций). Си-плюс-плюс-часть у него представлена несколькими классами, но классы «пустые» — весь их код находится тут же в заголовочных файлах в виде inline-функций, которые, в свою очередь, вызывают методы из псевдо-Си части.
Я, соответственно, пустую часть игнорирую и работают с псевдо-Си частью. Кроме того, я работаю из обычного C — я просто передекларировал функции сам, заменяя ссылки на указатели, объявил неполные типы, где нужно и так далее. Все работает замечательно.
Но есть нюанс. Что я не совсем понимаю, так это то, что имел в виду автор исходного API. Например:
1. Функция возвращает константную ссылку, т. е.
const foo::Bar& myfunc();
В своем C-адаптере я переопределяю ее так:
const foo_Bar_t* myfunc();
Правильно ли я понимаю, что я не могу хранить этот указатель после возврата из функции?
2. Класс с
private
-конструктором и сопутствующий
auto_ptr
. Выглядит это так:
namespace foo {
class Baz
{
private:
Baz();
Baz( const Baz& source);
};
class BazAutoPtr: public std:auto_ptr<Baz>
{
public:
inline BazAutoPtr();
};
}
BazAutoPtr()
являет собою следующее:
inline BazAutoPtr::BazAutoPtr() {
this->operator=(*static cast<Baz>(&std::auto_ptr<element_type>(Baz_Constructor())));
}
Здесь
Baz_Constructor
— это функция из псевдо-Си части, которая, собственно, создает новый Baz и возвращает указатель:
foo::Baz* Baz_Constructor();
Как я все это понимаю, объекты
foo::Baz
напрямую создавать нельзя, только через
auto_ptr
. Код в
BazAutoPtr()
вызывает реальный конструктор и подменяет там только что созданный пустой объект. Я также представляю смысл
auto_ptr
— выделить объект в куче и автоматом его удалить при выходе из функции. Что я не понимаю, так это что имел в виду автор API, сооружая вот эту конструкцию? Имел ли он в виду, что я вообще не должен хранить экземпляры
foo::Baz
или же что-то другое?
(Чисто технически я их храню пока без видимых последствий; но кто его знает.)