45

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

Bh

#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)
4

5 に答える 5

78

.mファイルに.mmという名前を付ける必要があります。そして、Objective-CでC++コードをコンパイルできるようになります。

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

于 2010-04-26T00:24:31.623 に答える
5

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

于 2010-04-26T00:24:33.793 に答える
2

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

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

@interface AppDelegate : UIResponder <UIApplicationDelegate,
                                    CLLocationManagerDelegate,
                                    MFMailComposeViewControllerDelegate>
{
    DBManager* db;
...
}
于 2012-07-01T15:13:58.477 に答える
1

このトピックに関して私が理解したいくつかのポイントを共有しています。

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

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

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

Cppオブジェクトを扱う場合、メモリの管理が問題になります。'new'を使用してオブジェクトにメモリを割り当て、'deleteobject'を呼び出すことでメモリを解放できます。通常、ARCを使用している場合、オブジェクトのメモリを解放することを意識する必要はありません。

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

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

Objective Cオブジェクトの割り当て解除は実行時に処理され、Cppオブジェクトに対して「delete」が呼び出されると、メモリに残りません。

Cppを作成するとき、ObjectiveCのstrongとweakに似たポインターとweakポインターを共有しました。

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

于 2014-07-27T19:32:10.403 に答える
0

そのような単純なC++関数を導入したい状況ではstd::cout <<、HotLicksが優れた代替手段を提供します。

""を変更しますIdentity and TypeFrom:Objective-C sourceTo:Objective-C++ source

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

于 2013-08-11T20:25:58.193 に答える