Подтвердить что ты не робот

Смешивание Objective-C и С++

Я пытаюсь смешивать Objective-C с С++. Когда я компилирую код, я получаю несколько ошибок.

хиджры

#import <Cocoa/Cocoa.h>
#include "B.h"

@interface A : NSView {
    B *b;
}

-(void) setB: (B *) theB;

@end

a.m

#import "A.h"

@implementation A

- (id)initWithFrame:(NSRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code here.
    }
    return self;
}

- (void)drawRect:(NSRect)dirtyRect {
    // Drawing code here.
}

-(void) setB: (B *) theB {
    b = theB;
}

@end

B.h

#include <iostream>

class B {

    B() {
        std::cout << "Hello from C++";
    }

};

Вот ошибки:

/Users/helixed/Desktop/Example/B.h:1:0 /Users/helixed/Desktop/Example/B.h:1:20: error: iostream: No such file or directory
/Users/helixed/Desktop/Example/B.h:3:0 /Users/helixed/Desktop/Example/B.h:3: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'B'
/Users/helixed/Desktop/Example/A.h:5:0 /Users/helixed/Desktop/Example/A.h:5: error: expected specifier-qualifier-list before 'B'
/Users/helixed/Desktop/Example/A.h:8:0 /Users/helixed/Desktop/Example/A.h:8: error: expected ')' before 'B'
/Users/helixed/Desktop/Example/A.m:26:0 /Users/helixed/Desktop/Example/A.m:26: error: expected ')' before 'B'
/Users/helixed/Desktop/Example/A.m:27:0 /Users/helixed/Desktop/Example/A.m:27: error: 'b' undeclared (first use in this function)
4b9b3361

Ответ 1

Вам нужно называть файлы .m .mm. И вы сможете скомпилировать код С++ с помощью Objective-C.

Итак, после вашего примера, ваш файл AView.m должен иметь имя AView.mm. Это просто. Он работает очень хорошо. Я использую много контейнеров std (std::vector, std:: queue и т.д.) И устаревший код С++ в проектах iPhone без каких-либо осложнений.

Ответ 2

Ничего, я чувствую себя глупо. Все, что вам нужно сделать, это переименовать AView.m в AView.mm, поэтому компилятор знает его Objective-C ++, и он компилируется без проблем.

Ответ 3

вы можете сохранить очиститель интерфейса с помощью прямого объявления классов С++:

#import <AnObjCclass.h>
class DBManager; // This is a C++ class. NOTE: not @class

@interface AppDelegate : UIResponder <UIApplicationDelegate,
                                    CLLocationManagerDelegate,
                                    MFMailComposeViewControllerDelegate>
{
    DBManager* db;
...
}

Ответ 5

Я разделяю некоторые моменты, которые я понял по этой теме.

Мы можем комбинировать файлы .cpp и .m с чистым интерфейсом C. Поскольку мы знаем, что компилятор Clang будет поддерживать С++, Objective C, а также Objective С++, это может быть лучшим средством для смешивания этих языков.

При смешивании этих языков, которые нужно позаботиться, нужно использовать файлы заголовков. Мы можем оставить С++ из наших заголовков Objective C, объявив объекты Cpp в расширениях классов.

В качестве альтернативы мы можем объявить объекты cpp только в начале блока @implementation в нашем файле Objective Cpp (.mm).

Управление памятью будет проблемой, когда мы имеем дело с объектами Cpp. Мы можем выделить memmory для объекта, используя "new" и освободить память, вызвав "delete object". Обычно, если мы используем ARC, нам не нужно осознавать освобождение памяти для объекта.

При использовании классов cpp мы можем объявить объект Cpp двумя способами: CppWrapper wrapper и CppWrapper * wrapper, где CppWrapper - класс Cpp. Когда мы используем последний, программист отвечает за управление memmory.

Еще одно главное, когда мы вызываем объектный метод C с параметрами, мы передаем ссылки, а в cpp нам нужно передать параметры по ссылке, используя '& ключевое слово, иначе копия объекта передается.

Освобождение объекта Objective C обрабатывается во время выполнения, где, когда "delete" вызывается для объекта Cpp, он больше не останется в памяти.

При написании Cpp у нас есть общий указатель и слабые указатели, который похож на сильный и слабый в Objective C.

http://philjordan.eu/article/mixing-objective-c-c++-and-objective-c++ http://www.raywenderlich.com/62989/introduction-c-ios-developers-part-1

Ответ 6

В ситуациях, когда вы хотите ввести простую функцию С++, например std::cout <<, тогда Hot Licks предлагает хорошую альтернативу.

Измените "Identity and Type" От: Objective-C source Кому: Objective-C++ source

Расширение .mm просто определяет тип файла; а затем вы ищете Objective-C ++ не тип Objective-C.