В настоящее время я разрабатываю 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*
из-за проблем с безопасностью типов.