web-dev-qa-db-ja.com

Objective-CとC ++の混合

Objective-CとC++を混在させようとしています。コードをコンパイルすると、いくつかのエラーが発生します。

ああ

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

@interface A : NSView {
    B *b;
}

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

@end

午前

#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)
43
LandonSchropp

。m files 。mmという名前を付ける必要があります。また、Objective-Cを使用してC++コードをコンパイルできます。

したがって、例に従って、AView.mファイルの名前はAView.mmとする必要があります。それは簡単です。とてもうまくいきます。私は多くのstdコンテナ(std :: vector、std :: queueなど)とレガシーのC++コードをiPhoneプロジェクトで複雑なことなく使用しています。

77

気にしないで、私は愚かだと感じます。必要なことは、AView.mの名前をAView.mmに変更するだけです。これにより、コンパイラはObjective-C++であることを認識し、問題なくコンパイルできます。

5
LandonSchropp

c ++クラスの前方宣言により、インターフェイスをよりクリーンに保つことができます。

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

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

このトピックについて理解した点のいくつかを共有しています。

.cppファイルと.mファイルの両方を純粋なCインターフェイスと混在させることができます。 Clangコンパイラは、C++、Objective C、Objective C++をサポートすることがわかっているため、これらの言語を混合するためのより良い手段になるかもしれません。

これらの言語を注意して混合する際の1つのことは、ヘッダーファイルを使用することです。クラス拡張でCppオブジェクトを宣言することにより、Objective CヘッダーからC++を除外できます。

あるいは、Objective Cpp(.mm)ファイルの@implementationブロックの先頭でcppオブジェクトを宣言することもできます。

メモリの管理は、Cppオブジェクトを扱う際の懸念事項になります。 「new」を使用してオブジェクトにメモリを割り当て、「delete object」を呼び出すことでメモリを解放できます。通常、ARCを使用している場合、オブジェクトのメモリを解放することを意識する必要はありません。

Cppクラスを使用しながら、CppWrapperラッパーとCppWrapper * wrapperという2つの方法でCppオブジェクトを宣言できます。CppWrapperはCppクラスです。後者を使用している場合、プログラマはメモリを管理する責任があります。

もう1つの主なことは、パラメーターを使用してObjective Cメソッドを呼び出すとき、参照を渡すことです。cppでは、「&」キーワードを使用して参照によってパラメーターを渡す必要があります。そうでない場合は、オブジェクトのコピーが渡されます.

Objective Cオブジェクトの割り当て解除は実行時に処理され、「削除」が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

1
iGo

std::cout <<のような単純なC++関数を導入したい場合は、Hot Licksが優れた代替手段を提供します。

Identity and Type」の変更元:Objective-C source宛先:Objective-C++ source

.mm拡張子は、単にファイルタイプを識別します。そして、あなたはObjective-C型ではなくObjective-C++を探しています。

0
Gabe Rainbow