2009-07-22 3 views
3

Я пытаюсь написать этот заголовочный файл:Как справиться с прямой декларацией/#import в Cocoa Touch (Objective-C cross C++) правильно?

//@class AQPlayer; 

//#import "AQPlayer.h" 

@interface AQ_PWN_iPhoneViewController : UIViewController { 

    AQPlayer* player; 
} 

@end 

AQPlayer является .mm файл, написанный на C++.

Я попытался сделать опережающее объявление класса здесь, но он жалуется мне:

error: cannot find interface declaration for 'AQPlayer'

Так что я попытался заголовочный файл «#import» вместо этого, но он жалуется на что-то полностью покинуть и странно , Вот кусочек ошибки жаловался:

В файле включены из

/Users/akaraphan/Desktop/SpecialTopic1/AQ_PWN_iPhone/Classes/AQPlayer.h:51, 
       from /Users/akaraphan/Desktop/SpecialTopic1/AQ_PWN_iPhone/Classes/AQ_PWN_iPhoneViewController.h:12, 
       from /Users/akaraphan/Desktop/SpecialTopic1/AQ_PWN_iPhone/Classes/AQ_PWN_iPhoneAppDelegate.m:10: 
/Developer/Examples/CoreAudio/PublicUtility/CAStreamBasicDescription.h:78: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'CAStreamBasicDescription' 
/Developer/Examples/CoreAudio/PublicUtility/CAStreamBasicDescription.h:230: error: expected '=', ',', ';', 'asm' or '__attribute__' before '<' token 
/Developer/Examples/CoreAudio/PublicUtility/CAStreamBasicDescription.h:231: error: expected '=', ',', ';', 'asm' or '__attribute__' before '==' token 
/Developer/Examples/CoreAudio/PublicUtility/CAStreamBasicDescription.h:233: error: expected '=', ',', ';', 'asm' or '__attribute__' before '!=' token 
/Developer/Examples/CoreAudio/PublicUtility/CAStreamBasicDescription.h:234: error: expected '=', ',', ';', 'asm' or '__attribute__' before '<=' token 
/Developer/Examples/CoreAudio/PublicUtility/CAStreamBasicDescription.h:235: error: expected '=', ',', ';', 'asm' or '__attribute__' before '>=' token 
/Developer/Examples/CoreAudio/PublicUtility/CAStreamBasicDescription.h:236: error: expected '=', ',', ';', 'asm' or '__attribute__' before '>' token 
/Developer/Examples/CoreAudio/PublicUtility/CAStreamBasicDescription.h:239: error: expected ';', ',' or ')' before '&' token 

я упускаю что-то? Разве я не могу сделать это для этого?

ответ

3

Обычный способ сделать это было бы:

// In your .h file... 
@class AQPlayer; 
@interface AQ_PWN_iPhoneViewController : UIViewController { 
    AQPlayer *player; 
} 
@end 

// In your .mm file (see below why it has to be .mm instead of .m)... 
#import "AQ_PWN_iPhoneViewController.h" 
#import "AQPlayer.h" 
@implementation AQ_PWN_iPhoneViewController 
... 
@end 

Тяжелые ошибки долг вы видите, вероятно, потому что компилятор пытается разобрать AQPlayer.h, как Objective-C вместо Objective-C++. Вам, вероятно, придется использовать .mm для всех ваших исходных файлов, которые импортируют AQPlayer, даже если этот конкретный класс не использует C++.

1

Я уже сделал свой AQ_PWN_iPhoneViewController файлом .mm. Так что нет, это не исправляет.

вот дополнительная информация: Ошибка ошибки: не удается найти объявление интерфейса для «AQPlayer», будет показано, если я попытался вызвать метод/функцию экземпляра AQPlayer. Вот пример:

- (void)viewDidLoad {

CFStringRef ref = (CFStringRef)[NSTemporaryDirectory() stringByAppendingPathComponent: @"1.mp3"]; 
player = new AQPlayer(&ref); 

OSStatus result = player->StartQueue(false); 

if (result == noErr) 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"playbackQueueResumed" object:self]; 

}

Удаление любого вызова функции как StartQueue сделает ошибку уйти, но мне нужно вызвать метод!

+0

Вы должны отредактировать исходный вопрос, а не публиковать его в качестве ответа. Сказав это, как AQPlayer - класс obj-c или C++?Первой декларации, которую вы дали '@class AQPlayer;' для Obj-C, но ваш метод вызывает 'player-> StartQueue (false);' - синтаксис C++. Либо вы хотите «класс AQPlayer;» для C++, либо '[player startQueue: NO];' для Obj-C. –

1

Я также получаю точно такую ​​же проблему (также пытаюсь повторно использовать класс AQPlayer C++ из демонстрации «SpeakHere» от Apple).

Кажется, компилятор запутался и пытается скомпилировать объектный-C++ как объективный-c (следовательно, все ошибки). Мне удалось заставить его скомпилировать, щелкнув правой кнопкой мыши на файле m, который импортирует файл mm и выберет «getInfo», а затем измените тип файла на «sourcecode.cpp.objcpp»

0

Во-первых, вы должны сообщить компилятору, что файл имеет код C++ (файл также содержит файл с кодом C++!). Вы можете сделать это, переименовав его в расширение .mm (.h останется тем же). Второй способ - установить тип файла 'sourcecode.cpp.objcpp', как сказал Atomoil.

Кроме того, если вы хотите форвардное объявление для класса C++, вы используете «класс AQPlayer;», а не «@class AQPlayer;». Если вы это сделаете, вы получите сообщение об ошибке «не можете найти интерфейс для ошибки XXX».

Обычно я включаю файлы C++ в файл .h, устраняя необходимость в прямом объявлении, хотя иногда вы не хотите делать это.