4

私はObjective-Cにかなり慣れていないので、プロジェクト用にiCloudユーティリティライブラリを構築しています。Objective-CでiCloudユーティリティクラスを作成しました。Objective-CでC++クラスを使用することについて多くの質問があることに気づきましたが、その逆はほとんどありません。問題は、私たちのプロジェクト(およびその上にプロジェクトが構築されているエンジン)が完全にC ++で記述されているため、私が作成したObjective-C icloudクラスは、私が作成しているC++インターフェイスからアクセスできる必要があることです。

次に例を示します。

iCloudUtils.h

#import <Foundation/Foundation.h>

@interface iCloudUtil : NSObject
@property(nonatomic, assign, getter=isAvailable) BOOL iCloudIsAvailable;

@property (assign) NSString *urlToFile;

-(bool) init_iCloud;
-(void) loadDocument: (NSString*)fileUrl;
@end

iCloudUtils.m

#import "iCloudUtil.h"
@synthesize urlToFile = _urlToFile;
@synthesize iCloudIsAvailable = _iCloudIsAvailable;
//////////////////////////////////////////////////////


@implementation iCloudUtil
-(bool) init_iCloud{
//blah blah
}

-(void) loadDocument: (NSString*)fileUrl{
//more blah blah
}

@end

私がこれを使おうとしているC++クラスは次のようなものです。

iCloudInterface.h

#ifndef __ICloudInterface__
#define __ICloudInterface__

class ICloudInterface {

    static ICloudInterface *_instance;
    bool iCloudIsAvailable;

public:
    ICloudInterface();
    ~ICloudInterface();

    bool init_iCloud();
};

#endif 

私がやりたいのは、C ++クラスでiCloudUtilsのインスタンスを作成できるようにすることですが、「プログラム内の漂遊'@'」に関する200以上のエラーが発生しない限り、c++クラスに#includeすることはできません。私はObjective-Cに非常に不慣れであり、C ++との混合についてはそれほど経験がないので、誰かがこれを達成する方法についてアドバイスを手伝ってくれるでしょうか?

編集:それを明確にするために、私はすでに.cppの名前を.mmに変更しようとしましたが、これは問題を修正していません。

Edit2:また、ファイルを.mmに変更して(間違っている場合は訂正してください)読んで理解したことから、それを含むすべてのファイルも.mmに変更する必要があります。単一のオプションクラスに合わせて非常に多数のファイルを変更する必要があるため、これを行うことはできません(このプロジェクトとそのエンジンはすべてc ++であり、これはクロスプラットフォームのエンジンとプロジェクトであることに注意してください)。

4

4 に答える 4

2

ファイル拡張子が .cpp の C++ ファイルで Obj.C クラス オブジェクトを使用することはできません

拡張子 .mm の Obj.C クラスで c++ クラスを使用できます

C++ と Obj.C クラスの間で通信するには、ヘルパー C++ クラスを .mm ファイルに記述します。

言う:

  interface iCloudUtil : NSObject  // in .m file
  class ICloudInterface            //in cpp file.

ブリッジ クラスのヘルプを使用して、.cpp ファイルの cpp クラスと .m ファイルの obj.C クラスの間で通信できます。

//include iCloudUtil.h only in ICloudBridge.mm file.

class ICloudBridge {

    static ICloudBridge *_instance;

public:
    ICloudBridge();
    ~ ICloudBridge();

    ICloudBridge *sharedICloudBridge();
    void loadDocument();
};

void  ICloudBridge:: loadDocument()
{
   iCloudUtil *obj = [iCloudUtil alloc] init] autorelese];
   [obj  loadDocument:@"DocName"];
}

ICloudInterface.cpp で

ICloudBridge *bridge = ICloudBridge::sharedICloudBridge();
bridge-> loadDocument();
于 2013-02-21T18:19:54.770 に答える
2

.cpp ファイル名を .mm に切り替えます。これにより、C++ から Objective-C++ に変換されます。次に、ヘッダーを理解する言語をコンパイルします。

于 2013-02-21T17:59:21.920 に答える
1

.mmソースコードのファイル名に拡張子の代わりに.m拡張子を使用するか、Xcode で Objective-C++ としてコンパイルするようにファイルを設定する必要があると思います。

于 2013-02-21T17:59:30.657 に答える
0

確かに - あなたはこれを行うことができます。必要な主なことは、.CPP ファイルを「Objective-C++ ソース」として設定することです。「.mm」規則は自動的に便利ですが、必須ではありません。その後、好きなように組み合わせることができます。

#import <Foundation/Foundation.h>
#include <iostream>

@interface iCloudUtil : NSObject
@property(nonatomic, assign, getter=isAvailable) BOOL iCloudIsAvailable;
@property(assign) NSString *urlToFile;
- (bool) init_iCloud;
- (void) loadDocument:(NSString*)fileUrl;
@end

//////////////////////////////////////////////////////
@implementation iCloudUtil

@synthesize urlToFile = _urlToFile;
@synthesize iCloudIsAvailable = _iCloudIsAvailable;

- (bool) init_iCloud {
    NSLog(@"init_iCloud");
    std::cout << "i can mix std c++ in here as well\n";
    return YES;
}

- (void) loadDocument:(NSString*)fileUrl {
    NSLog(@"url is %@",fileUrl);
}

@end
//////////////////////////////////////////////////////

class ICloudInterface {
    static ICloudInterface* _instance;
    bool iCloudIsAvailable;
    iCloudUtil* myCloudUtil;
public:
    ICloudInterface();
    ~ICloudInterface();

    bool init_iCloud();
};

ICloudInterface::ICloudInterface() {
    std::cout << "ICloudInterface::ctor\n";
    myCloudUtil = [[iCloudUtil alloc] init];
    [myCloudUtil init_iCloud];
    [myCloudUtil loadDocument:@"file://foo/bar/baz"];
}

ICloudInterface::~ICloudInterface() {
    [myCloudUtil release], myCloudUtil = nil;
    std::cout << "ICloudInterface::dtor\n";
}

int main(int argc, const char * argv[]) {
    std::cout << "Test objc/objc++\n";
    ICloudInterface iface;
    return 0;
}
于 2013-02-21T19:23:06.137 に答える