私は現在、ユーザーが不透明なポインターを渡すことができるようにする 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*
もちろん、型の安全性の問題からa は使いたくありません。