0

次の疑似コードを作成する必要があります。

.h ファイル内:

class Foo
{
public:
    Foo();
    ~Foo();
    void MyFunc();
};

.cpp/.m/.mm/。ファイル:

Foo::Foo()
{
#if MAC
// Cocoa-specific initialization goes here
#endif
#if Windows
// Windows-specific initialization goes here
#endif
}

XCode と MSVC を使用し、wxWidgets を使用して開発しているため、MSVC プロジェクトと XCode プロジェクトの両方にファイルを含めることができる必要があります。

考えられる最善の解決策は何ですか?2 つのファイル (.h/.cpp) を意味する 1 つのクラスが必要です。

ありがとうございました。

[編集] 私はこれを見つけました: C++ で Cocoa オブジェクトを作成する方法は? geovar からのコメントはそれが可能であることを示していますが、私が持っている XCode (Snow Leopard のバージョン 3.2 64 ビット) でそのオプションを見つけることができません。ポインタはありますか?

ありがとうございました。[/編集]

4

1 に答える 1

0

プリプロセッサ テスト__OBJC__を使用して、"純粋な" C++ ファイルでも使用される可能性のあるヘッダーで Objective-C コードを条件付きで宣言できます。例えば:

#ifdef __OBJC__
  @interface Whatever : NSObject
  {
    . . .
  }
  . . .
  @end

#else

  class Whatever;

#endif

class SomeCPPClass
{
  . . .
};

// this actually works; the pointer form of the class
// can be passed freely from Objective-C++ to C++ through
// a plain-C or C++ routine such as this one
void SomeFunction (Whatever* param);

Objective-C++ を必要とするソース ファイルの場合は、名前を変更します ( WhateverName.mm. これは必須かもしれませんし、そうでないかもしれませんが、カスタム ビルド ルールを設定する必要がないため、少なくとも便利です。

ファイルの名前が変更され、Objective-C++ コンパイラを使用している場合でも、必要に応じて 99% C++ にすることができます (明らかな例外を除きます。たとえば、名前を付けることはできませんid)。一般に、C++ からやりたいことはすべてうまくいきます。

そうは言っても、いくつかの癖があるため、Objective-C と C++ との相互作用を読んでください。たとえば、Objective-C 例外は、スローされたときに C++ オブジェクト デストラクタを呼び出しません(少なくとも、言語の一部のバージョンでは)。C++ 例外、Objective-C++ で期待どおりに動作することに注意してください。でキャッチする必要がある Objective-C の例外について言及しています@try。C++ で RAII スタイルのクラスが与えられた場合、私が考えることができる唯一のクリーンアップ ソリューションは、次のように、条件付きクリーンアップを実行し、それを明示的に呼び出すメソッドを追加することでした。

@try
{
    SomeRAIIStyleObject x;
    doSomethingThatMightTriggerObjCException(x);
}
. . .
@finally
{
    x.tearDownIfNeeded();
}
于 2012-06-30T06:18:41.493 に答える