14

.cpp/.hpp ファイル コンボがあります -> .hpp ファイルには #include ..

.mm/.h ファイル コンボもあります -> .mm Objective C++ ファイル内に .hpp ファイルを含めても、問題はありません。しかし、.hpp ファイルを .h (Objective C ヘッダー) ファイルに含めようとすると、プリプロセッサの問題「iostream not found」が発生します。

Objective C の .h ファイルに void* を持ち、それを .mm に含まれる型としてキャストするか、Objective C++ 型内のすべての C++ 型をラップするなどのファンキーなことを行う以外に、これを回避する方法はありますか?

私の質問は基本的にトニーの質問と同じです (しかし、誰も彼に答えませんでした):

https://stackoverflow.com/questions/10163322/how-to-include-c-header-file-in-objective-c-header-file

4

3 に答える 3

25

問題は、通常のObjective-Cクラスにヘッダーを含めることができるようにするには、ヘッダー内のすべてのC++セマンティクスを回避する必要があることです。これは、不透明なポインタを使用して実行できます。

CPPClass.h

class CPPClass
{
public:
    int getNumber()
    {
        return 10;
    }
};

ObjCPP.h

//Forward declare struct
struct CPPMembers;

@interface ObjCPP : NSObject
{
    //opaque pointer to store cpp members
    struct CPPMembers *_cppMembers;
}

@end

ObjCPP.mm

#import "ObjCPP.h"
#import "CPPClass.h"

struct CPPMembers {
    CPPClass member1;
};

@implementation ObjCPP

- (id)init
{
    self = [super init];
    if (self) {
        //Allocate storage for members
        _cppMembers = new CPPMembers;

        //usage
        NSLog(@"%d", _cppMembers->member1.getNumber());
    }

    return self;
}

- (void)dealloc
{
    //Free members even if ARC.
    delete _cppMembers;

    //If not ARC uncomment the following line
    //[super dealloc];
}

@end
于 2012-12-04T13:54:48.243 に答える
4

Objective-C++ ヘッダー ファイルで C++ を使用するには、次のことを確認してください。

  1. .h/.mm の組み合わせがある (Objective-C++)
  2. ファイルの ID で、タイプを Objective-C++ Source に設定します (自動である必要があります)。
  3. Objective-C++ ソース ファイルからのみ対象ファイルを含めます。この点は明らかですが、すぐに忘れてしまい、追跡するのが難しい場合があります
于 2014-07-04T08:05:34.803 に答える
0

#include ディレクティブは単にテキストを含めます。Objective C が文句を言うのは、有効な Objective C ではないものがインクルード ファイルにある場合のみです。

あなたの場合、それはあなたに答えを与えます。iostream.h ヘッダー ファイルが Objective C に見つかりません。このファイルが参照されている場所を見つけて、#include を削除します。

于 2012-12-03T20:57:52.633 に答える