2014-05-07 35 views
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*

回答

1

如果你要強制施放,爲什麼不只是void *

但是你只是在這裏寫C。爲什麼要傳遞一個接口和一個上下文 - 接口的實現是的上下文;它是一個對象,無論它需要什麼成員變量。

+0

1)因爲'void *'不提供類型安全;任何事情都可以在未經同意的情況下投給「無效*」。要求明確演員陣容更好,用戶的意圖應該是顯而易見的。 2)我簡化了我的例子,但它不是C,它的意思是C++。 問題的主要觀點是'typedef'ed未定義結構指針'和'typedef'ed無名結構指針'之間的技術/語義差異。 – HiroshimaCC

相關問題