Не удается найти стандартные включения C ++ при использовании класса C ++ в проекте Какао - PullRequest
8 голосов
/ 21 мая 2011

У меня есть проект Какао (приложение Mac OS X), все Objective-C. Я извлек один класс C ++ (который, как я знаю, работает) из другого проекта и создал для него оболочку Objective-C. Класс-обёртка ObjC использует расширение .mm. Однако заголовочный файл C ++ содержит #include s для стандартных заголовочных файлов C ++ (например, <vector>), и я получаю ошибки по ним.

Минимальный пример будет выглядеть следующим образом. CppClass - это класс C ++, а CppWrapper - это класс ObjC, который обертывает его.

//  CppClass.h
#ifndef _CPP_CLASS_H_
#define _CPP_CLASS_H_

#include <vector>

class CppClass
{
public:
    CppClass() {}
    ~CppClass() {}

private:
    std::vector<int> my_ints;
};
#endif /* _CPP_CLASS_H_ */

//  CppWrapper.h
#import <Foundation/Foundation.h>
#import "CppClass.h"

@interface CppWrapper : NSObject {
    CppClass* myCppClass;
}
@end

//  CppWrapper.mm
#import "CppWrapper.h"

@implementation CppWrapper

- (id)init
{
    self = [super init];
    if (self) {
        myCppClass = new CppClass;
    }    
    return self;
}

- (void)dealloc
{
    delete myCppClass;

    [super dealloc];
}

@end

// The file that uses CppWrapper
//  TestAppDelegate.m

#import "TestAppDelegate.h"
#import "CppWrapper.h"

@implementation TestAppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    myWrapper = [[CppWrapper alloc] init];
}
@end

Я получаю ошибку #include из vector в CppClass.h. Ошибка

Проблема лексического или препроцессора: 'vector' файл не найден

Этот код отлично работает в другом (все C ++) проекте, так что я почти уверен, что это настройка сборки или что-то я сделал неправильно в классе-оболочке. Я использую Xcode 4. Я создал проект приложения Mac OS по умолчанию, и все настройки по умолчанию.

Обновление : Я только что понял, что, если я устанавливаю Тип файла TestAppDelegate в Objective-C ++ (или переименовываю его в TestAppDelegate.mm), это работает. Что я не понимаю, так это то, что этот класс - чистый Objective-C; почему он должен быть скомпилирован как Objective-C ++? Весь смысл наличия оболочки Objective-C в моем классе C ++ состоит в том, что мне не нужно создавать весь проект как Objective-C ++.

Ответы [ 2 ]

13 голосов
/ 22 мая 2011

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

Вместо этого вам нужно сделать что-то подобное, чтобы полностью скрыть C ++ в файле CppWrapper.mm:

//  CppWrapper.h
#import <Foundation/Foundation.h>

@interface CppWrapper : NSObject {
    void *myCppClass;
}
- (void)doSomethingWithCppClass;
@end


//  CppWrapper.mm
#import "CppWrapper.h"
#import "CppClass.h"

@implementation CppWrapper

- (id)init {
    self = [super init];
    if (self) {
        myCppClass = new CppClass;
    }    
    return self;
}

- (void)dealloc {
    delete myCppClass;
    [super dealloc];
}

- (void)doSomethingWithCppClass {
   static_cast<CppClass *>(myCppClass)->DoSomething();
}

@end
0 голосов
/ 21 мая 2011

Лично я бы

#include "CppClass.h"

вместо импорта.

Возможно, это не твоя проблема.

...