2009-04-09 10 views

答えて

67

「不透明タイプ」は、structまたはclassの完全な定義がないタイプです。コンパイラはあなたが直接使って何をやらせるのに十分な情報を持っていない

// forward declaration of struct in C, C++ and Objective-C 
struct Foo; 

// forward declaration of class in C++: 
class Bar; 

// forward declaration of class in Objective-C: 
@class Baz; 

:C、C++とObjective-Cでは、型は前方宣言を使用することにより、後に定義されるコンパイラに伝えることができますstructまたはclassにポインタを宣言しますが、これは頻繁に行う必要があります。これにより、ライブラリとフレームワークの作成者は実装の詳細を隠すことができます。ライブラリまたはフレームワークのユーザは、ヘルパー関数を呼び出して、structまたはclassと宣言されたフォワードのインスタンスを作成、操作、破棄します。例えば、フレームワークの作成者はstruct Fooのため、これらの関数を作成することができます。

struct Foo *createFoo(void); 
void addNumberToFoo(struct Foo *foo, int number); 
void destroyFoo(struct Foo *foo); 

Core Foundationのフレームワークの一環として、AppleはNSStringNSArrayと不透明型によるCプログラマに利用できるNSBundleのような一般的なObjective-Cのクラスになります。 Cプログラマは、これらのObjective-Cクラスのインスタンスを作成、操作、破棄するためにポインタとヘルパー関数を使用します。 Appleはこの「フリーダイヤルブリッジ」と呼んでいます。 "CF"接頭辞+クラス名+ "Ref"接尾辞ここで、 "CF"は "Core Foundation"を表し、 "Ref"は "Reference"の略で、ポインタを意味します。

+0

非常に印象深い良い答え!ありがとう!! – Thanks

+0

さらにもう1つの質問:フレームワークの作成者は、これらのヘルパー関数を提供するのですか、またはユーザーが作成しますか? – Thanks

+0

フレームワーククリエータがそれらを提供します。 –

13

不透明なタイプは、下位レベルのタイプを「ラップする」タイプであり、基礎となる実装が複雑である場合や、内部の動作についてユーザが単純に知る必要がない場合によく使用されます。 Appleはここに不透明タイプに良いページを持っています。たとえば

https://developer.apple.com/library/ios/#documentation/CoreFoundation/Conceptual/CFDesignConcepts/Articles/OpaqueTypes.html

を、CFStringには、それが文字配列をラップしているため、不透明タイプであるなど、その長さは、そのエンコーディングを維持するが、直接はできません。ユーザーはこれらの値にアクセスできます。むしろ、内部フィールドにアクセスまたは操作し、関連情報をユーザーに返すメソッドを提供します。

2

これは将来宣言された構造体です。例:

typedef struct CFBundle *CFBundleRef; 

"struct CFBundle"の実際の定義がない場合、コードはCFBundleRefポインタ内の何にもアクセスできません。これは不透明です。

関連する問題