1

私は現在、ユーザーが不透明なポインターを渡すことができるようにする 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 は使いたくありません。

4

1 に答える 1

1

とにかくキャストを強制するつもりなら、どうしてvoid *?

しかし、あなたはここで C を書いているだけです。インターフェイスとコンテキストの両方を渡す理由 - インターフェイスの実装はコンテキストです。これは、必要なメンバー変数を持つオブジェクトです。

于 2014-05-07T21:33:34.423 に答える