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

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


person HiroshimaCC    schedule 07.05.2014    source источник


Ответы (1)


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

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

person Alan Stokes    schedule 07.05.2014
comment
1) Поскольку void* не обеспечивает безопасности типов; что угодно может быть передано void* без согласия. Лучше требовать явного приведения, намерение пользователя должно быть очевидным. 2) Я слишком упростил свой пример, но это не C, это (должно быть) C++. Суть вопроса заключается в технической/семантической разнице между typedef'ed undefined structure pointer и typedef'ed unnamed structure pointer. - person HiroshimaCC; 08.05.2014