2009-02-27 6 views
0

Bu soruyu sormaktan çekiniyorum, çünkü bu kadar kolay bir cevaba sahip olduğumuza eminim, ancak bunu anlayamıyorum. Buraya:Objective-C sınıflarındaki ilişkiler

bir dosyada bu Objective-C kodu Copier.h denilen vardır:

#import <Cocoa/Cocoa.h> 
#import "CopyQueue.h"; 


@interface Copier : NSObject { 
    IBOutlet NSTextField *statusField; 
    IBOutlet NSTextField *toField; 
    CopyQueue *queue; 
} 
- (IBAction)startCopy:(id)sender; 
- (void)dropFile:(NSString *)theFileName; 
@end 

Ve Xcode Projemi derlemek denediğinizde bunu CopyQueue *queue; yazan yere, ben satırında bir sözdizimi hatası alıyorum Neyi yanlış yapıyorum?

Çizgiyi id *queue; olarak değiştirdiğimde dosya derler, ancak bu çözüm olamaz, değil mi? Tüm yazılan referansları genel olanlarla değiştirmek mi istiyorsunuz?

+0

CopyQueue tanımının dahil edildiğinden emin misiniz? – anand

cevap

1

deneyin ...

@class CopyQueue 

@interface { 
    ... 
} 

... 

@end 
+0

Harika! Sen en iyisisin :) Bunu nasıl özleyebildim bilmiyorum. – winsmith

1

Predeclaring CopyQueue gerekli olmamalıdır ("@class CopyQueue" David McGraw yayınladığını) afiş zaten çizgi "#import "CopyQueue.h" yazmıştır olarak ;". Belki de gereksiz ";" "#import 'CopyQueue' neden olan sorunlardan sonra? Her halükarda

, CopyQueue (aynı yazım ve dava ile) CopyQueue.h dosyasında düzgün bildirilmiş olduğundan emin olun.

+0

CopyQueue.h, söyleyebileceğim kadarıyla doğru. #import "CopyQueue.h" ifadesinden sonra noktalı virgülü kaldırmak hiçbir şeyi değiştirmez. CopyQueue.h, @Class CopyQueue ifadesini içermeli mi? – winsmith

0

Bu değil Her ne kadar aptalca bir soru: Bu, C (ve C üst kümesi olan Objective-C) C gibi statik olarak yazılan, derlenmiş bir dil kullanmanın daha karmaşık yönlerinden birini yansıtır. (Python, Ruby, PHP gibi) dinamik olarak yazılan dillerden gelen insanlar için .), bu biraz inişli çıkış olabilir.

Bir tür kullanabilmeniz için önce (C, Objective-C veya C++), bu türü bildirmelisiniz CopyQueue bir tür, bu nedenle bildirilmesi gerekir (@interface CopyQueue : SomeClass {} @end kullanarak veya @class CopyQueue kullanarak örtülü olarak bildirildi. Yayınladığınız örnekte, bir Kakao programcı (Lyndsey Ferguson'a yorumunuz o olmadığını göstermektedir) bu durum söz konusu değilse CopyQueue.h bu

@interface CopyQueue : SuperClass { //where SuperClass is the name of the class that CopyQueue inherits from 

    ... 
    } 
... 
@end 

gibi bir şey içerdiğini varsayalım olur, sen başlığı içermesi gerekir CopyQueue sınıf türünü (yukarıdaki gibi) tanımlayan veya derleyiciye CopyQueue öğesinin bir sınıf olduğunu bildiren dosya (@class CopyQueue kullanarak).

@class CopyQueue bildirimi, derleyiciye CopyQueue* nesnesini bir Objective-C sınıfına (type id) işaretçi olarak gösterebileceğini ve ayrıntıları (CopyQueue örneğinin değişkenleri ve yöntemleri gibi) doldurabilmesinin bir yoludur. Daha sonra bir @interface aracılığıyla (ayrı bir modülde olduğu gibi).

+0

http://bitbucket.org/winsmith/copymeister/src/ adresindeki kaynağa bir göz atın. CopyQueue'nin tanımı dosyaya dahil edilmiştir, ancak yine de çalışmasını sağlamak için @ sınıfına ihtiyacım var. (btw benim için tamam) – winsmith

+0

Dairesel bir referans var: Copier.h, Copier.h dosyasını import eden CopyQueue.h dosyasını içeriyor. Bu durumda, siz haklısınız: forward @class bildirimini kullanmanız gerekir. CopyCueue.h dosyasının başlığını @class CopyQueue satırıyla kaldırabilirsiniz. –