Должен ли непрозрачный указатель быть реализован с использованием неназванной структуры или неопределенного тега?

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

1

Решение

Если вы все равно собираетесь принудительно использовать касты, то почему бы просто void *?

Но ты просто пишешь здесь. Зачем передавать и интерфейс, и контекст — реализация интерфейса является контекст; это объект, с любыми необходимыми переменными-членами.

1

Другие решения


По вопросам рекламы [email protected]