0

C++クラスインスタンスで関数呼び出しを行う必要があるObjective-Cクラスを作成しています。この提案を見つけましたが、試してみると、タイプ'structMyCPlusPlusClass'の定義が不完全であるというエラーが発生します。

struct MyCPlusPlusClass;

typedef struct MyCPlusPlusClass MyCPlusPlusClass;

@interface MyBridgeClass() {
    MyCPlusPlusClass *my_CPlusPlus;
}

...

- (id)initWithMrGame:(MyCPlusPlusClass *)cPlusPlus
{
    self = [super init]; 
    if (self) {
        my_CPlusPlus = cPlusPlusClass;
        my_CPlusPlus->p_favorite_integer = 0; // Compiler error
    }
    return self;
}

実際の定義は、チャレンジの別のレイヤーを追加するために、プリコンパイラーによって生成された.mmファイルで行われます。

これをどのように機能させることができますか?

編集:アダムの答えを解釈する

// in MyCode.h

struct MyCPlusPlusClass;  // Forward declaration, no need for #include/#import

@interface MyBridgeClass() {
    struct MyCPlusPlusClass *my_CPlusPlus;
}


// in MyCode.m
#include MyCode.h


// in BigGenerateFile.mm
class MyCPlusPlusClass;

class MyCPlusPlusClass { ... }

私の目標は、MyCode.mでMyCPlusPlusClassを使用できるようにすることですが、コンパイラーが非常に不満になるため、.mmファイルを含めることができません。このことを設計する方法は、私を別の道に向かわせることになるかもしれません。

4

2 に答える 2

6

不完全な構造体/クラスのメンバー変数にはアクセスできません。そのためには、完全な定義が必要です。通常、ヘッダー ファイルで前方宣言を使用して、そのヘッダーをインクルードするものは、不要な他のヘッダー ファイルを大量に取り込まないようにしますが、ソース ファイルの場合は通常、完全な定義が必要です。

したがって、コードを次のように変更することをお勧めします。

// Header file (.h)
struct MyCPlusPlusClass;  // Forward declaration, no need for #include/#import

@interface MyBridgeClass() {
    struct MyCPlusPlusClass *my_CPlusPlus;
}

// Source file (.mm)
#include "MyCPlusPlusClass.h"
...
// Can now access my_CPlusPlus->p_favorite_integer etc.
于 2012-09-04T19:33:44.367 に答える
1

不完全な型に対して多くのことを実行できますが、その型のオブジェクトのメンバーへのアクセスはそれらの 1 つではありません。

簡単な可能な解決策は、完全な型が利用可能な場所で定義されたヘルパー関数です。

void set_p_favorite_integer(MyCPlusPlusClass*, int);
// ...
set_p_favorite_integer(my_CPlusPlus, 0);
于 2012-09-04T19:28:43.767 に答える