В настоящее время я разрабатываю API, который позволяет пользователю передавать непрозрачный указатель, который будет возвращен позже при вызове методов интерфейса, который он должен реализовать.
Это в основном сводится к следующему:
API сторона:
class IAPIInterface
{
public:
virtual void APIMethod(CustomContext ctx) = 0;
}
void SetInterface(IAPIInterface* api, CustomContext ctx);
На стороне пользователя:
class UserInterfaceImpl : public IAPIInterface
{
public:
virtual void APIMethod(CustomContext ctx) {...}
};UserInterfaceImpl* userInterfaceImpl = new UserInterfaceImpl();
struct UserContext {...} userContext;
SetInterface(userInterfaceImpl, &userContext); // May need a cast
Каков наилучший способ определения непрозрачного указателя в этом сценарии?
В основном я думал о
typedef struct _CustomContext* CustomContext;
который определяет указатель на неопределенную (объявленную заранее) структуру.
Но мне также было интересно
typedef struct {} * CustomContext;
которые определяют указатель на безымянную структуру, может быть хорошей альтернативой? Основная проблема, которую я вижу, заключается в том, что, возможно, она будет определять другую структуру, если включена в другую единицу перевода. Это что правильно?
Конечно, я не хочу использовать void*
из-за проблемы безопасности типа.
Если вы все равно собираетесь принудительно использовать касты, то почему бы просто void *
?
Но ты просто пишешь здесь. Зачем передавать и интерфейс, и контекст — реализация интерфейса является контекст; это объект, с любыми необходимыми переменными-членами.