Отношения в Objective-C классах - PullRequest
0 голосов
/ 27 февраля 2009

Я действительно не решаюсь задать этот вопрос, так как он наверняка даст такой ужасно простой ответ, но я просто не могу понять это. Здесь идет:

У меня есть этот код Objective C в файле с именем Copier.h:

#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

И всякий раз, когда я пытаюсь скомпилировать свой проект в Xcode, я получаю синтаксическую ошибку в строке, где написано CopyQueue *queue; Что я делаю неправильно?

Файл компилируется, когда я изменяю строку на id *queue;, но это не может быть решением, не так ли? Замена всех типизированных ссылок на общие?

Ответы [ 3 ]

1 голос
/ 27 февраля 2009

Предварительное выделение CopyQueue не должно быть необходимым («@class CopyQueue», который опубликовал Дэвид МакГроу), так как автор уже написал строку «#import» CopyQueue.h ";". Возможно ненужное ";" после "#import" CopyQueue "вызывает проблемы?

В любом случае, убедитесь, что CopyQueue правильно объявлен в файле CopyQueue.h (с тем же написанием и регистром).

1 голос
/ 27 февраля 2009

Try ...

@class CopyQueue  

@interface {
     ...
}

...

@end
0 голосов
/ 27 февраля 2009

Это совсем не глупый вопрос. Он отражает один из более сложных аспектов использования статически типизированного, скомпилированного языка, такого как C (и Objective-C, который является надмножеством C). Для людей, пришедших из динамически типизированных языков (таких как Python, Ruby, PHP и т. Д.), Это может быть слегка неровный переход.

Прежде чем вы сможете использовать тип (в C, Objective-C или C ++), вы должны объявить этот тип. CopyQueue - это тип, поэтому он должен быть объявлен (с использованием @interface CopyQueue : SomeClass {} @end или неявно объявлен с использованием @class CopyQueue. В приведенном вами примере программист Какао предположил бы, что CopyQueue.h содержит что-то подобное

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

  ...
  }
...
@end

Если это не так (ваш комментарий к Линдси Фергюсон подсказывает, что это не так), вы должны включить заголовочный файл, который определяет тип класса CopyQueue (как выше), или сообщить компилятору, что CopyQueue является классом (используя @class CopyQueue).

Объявление @class CopyQueue - это способ сообщить компилятору, что он может обрабатывать CopyQueue* как указатель на класс Objective-C (идентификатор типа) и что вы будете заполнять детали (например, переменные экземпляра CopyQueue) и методы) через @interface позже (например, в отдельном модуле).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...