Смешивание 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)
Ответы
Ответ 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;
...
}
Ответ 4
Я столкнулся с этой статьей, которая могла бы помочь.
Смешивание Objective-C, С++ и Objective-C ++
Ответ 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.