2009-04-09 23 views

cevap

67

"Opak tür", struct veya class için tam tanıma sahip olmadığınız bir türüdür. Eğer doğrudan bir şey yapmak

// 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; 

derleyici izin için yeterli bilgiye sahip değildir: C, C++ ve Objective-C, bir tür ileri bildirimi kullanarak daha sonra belirlenecektir derleyici söyleyebilir struct veya class işaretçilerine bildirme dışında, ancak bu genellikle yapmanız gereken tek şeydir. Bu, kütüphane ve çerçeve yaratıcılarının uygulama ayrıntılarını gizlemesine izin verir. Bir kitaplığın veya çerçevenin kullanıcıları, daha sonra bildirilen ileri düzey bir struct veya class örneklerini oluşturmak, değiştirmek ve yok etmek için yardımcı işlevlerini çağırır. Örneğin, bir çerçeve yaratıcısı struct Foo için bu işlevleri oluşturabilirsiniz: Çekirdek Vakfı çerçevesinin bir parçası olarak

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

Apple opak türleri üzerinden C programcıların mevcut NSString, NSArray ve NSBundle gibi yaygın Objective-C sınıfları yapar. C programcılar, bu Objective-C sınıflarının örneklerini oluşturmak, değiştirmek ve yok etmek için işaretçi ve yardımcı işlevler kullanır. Apple bu "ücretsiz ücretsiz köprüleme" diyor. Ortak bir adlandırma kuralı izlerler: "CF" önek + sınıf adı + "Ref" soneki, "CF" nin "Core Foundation" anlamına geldiği ve "Ref" "Reference" için kısa, yani bir işaretçi anlamına gelir.

+0

çok etkileyici iyi cevap! Teşekkürler!! – Thanks

+0

bunlarla ilgili bir soru daha var: Çerçevelerin yaratıcıları bu yardımcı işlevleri sağlıyor mu, yoksa kullanıcılar bunları mı yapıyor? – Thanks

+0

Çerçeve yaratıcıları bunları sağlar. –

13

Opak tür, alt düzeydeki türleri "saran" bir türdür ve genellikle temel uygulama karmaşık olduğunda veya kullanıcının yalnızca iç işleyiş hakkında bilgi sahibi olması gerekmediğinde kullanılır. o, bir karakter dizisi sarar vb uzunluğunu, resmin şifrelemesini korur çünkü

Örneğin

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

, CFString opak türüdür, ancak doğrudan izin vermez: Elma burada opak türleri üzerinde iyi bir sayfası vardır kullanıcı bu değerlere erişir. Daha ziyade, iç alanlara erişen ya da bunları manipüle eden ve kullanıcıya ilgili bilgiyi döndüren yöntemler sağlar.

2

Gelecekte bildirilen bir yapıdır. Örneğin:

typedef struct CFBundle *CFBundleRef; 

"yapı CFBundle" gerçek tanımı olmadan, kod CFBundleRef pointer içinde herhangi erişemez. Bu opak.