6

私はBox2Dプログラミングを行っており、率直に言って、私はC ++とCに完全に精通しています。私は、Objective-Cの人であり、そのため、言語を理解するのが非常に難しくなっています。特に:

->

基本的に、これは以下のようなさまざまなメソッドや関数、または変数/プロパティを参照するために使用されることを理解しています。

body->GetWorld()->DestroyBody(body);

つまり、これはObjective-Cのドット表記に相当します。

// made up example
[body.world destroyBody];

また

[self destroyBody:body.world];

または同様の何か?私は本当にこれを理解していません。誰かが私にこれが何であるかについて頭を上げてもらえますか?ありがとう!

4

5 に答える 5

10

->Objective-Cはわかりませんが、Cと.C++の違いを説明できます。お役に立てば幸いです。

.struct/classインスタンスのメンバーにアクセスできるようにする演算子です。a->b-と同じである(*a).bため、最初にポインターを逆参照し、次にポインターが指しているインスタンスのメンバーにアクセスします。

また、Luchianが言及したケースがあります-operator->()与えられたクラスのオーバーロード。使用しているクラスがこの演算子をオーバーロードする場合、動作は異なり、クラスによって定義されます。つまり、必要なものすべてを実質的に返すことができます。

于 2012-05-21T09:58:42.570 に答える
4

Objective-Cについてはよくわかりませんが、C ++についてのヘルプを提供することができますFoo。C++でクラスを定義し、メソッドを使用すると仮定しbar()ます。

class Foo
{
public:
  void bar();
  ...
};

Foo スタックにのインスタンスを割り当てる場合は、ドット表記( )を使用.してメソッドを呼び出しますbar()

Foo f;
f.bar();

のインスタンスへのポインタがある場合はFoo矢印表記->)を使用してメソッドを呼び出しますbar()

Foo* pf; // must point to some instance of Foo
pf->bar();

(複雑にするために、値の構文とポインターのセマンティクスを持つ参照Fooもあります。 (たとえばFoo& f)への参照がある場合でも、ドット表記を使用しますf.bar();。)

于 2012-05-21T10:03:28.183 に答える
2

.オブジェクトメンバーにアクセスするために->使用され、ポインタを介してメンバーにアクセスするために使用されます。通常はoperator ->オーバーロードできます。つまり、オブジェクトでも使用できます。

struct X
{
   X* other;
   X* operator->() {return other;}
};

X x;
x->other;

この場合、x->otherは参照しませんx.otherが、を参照しx.other.otherます。:D

于 2012-05-21T10:06:42.343 に答える
2

いいえ、Objective-Cプロパティにアクセスするために使用することは、CおよびC++の構造体およびクラスメンバーにアクセスするために使用することと.同じではありません。->.

Objective-Cプロパティアクセサーidは、型(ポインター型)の値を処理しますが、特別な命名規則を使用して、実際に何を行うかを決定します。プロパティデータメンバーに直接アクセスできる->ため、データメンバーアクセスの場合と同様です。または、プロパティ値を取得および/または設定するための特別な関数を検索できます。この場合、メッセージ送信のシンタックスシュガーです。

C ++での演算子のオーバーロードの場合を除いて->、ポインターを逆参照してから参照されるメンバーにアクセスすることと常に同じです。a->bと同等(*a).bです。bメンバー関数のデータメンバーである可能性がありますが、アクセスされるメンバーは、で参照される正確な名前を持ち、b特別な命名規則に基づく変更ではありません。メンバー関数に名前を付ける場合b、それは仮想関数である可能性があります。これは、Objective-Cで送信されるメッセージといくつかの類似点がありますが、同じではありません。bまた、Objective-Cには同等のものがないC++のオーバーロードされたメンバー関数である可能性があります。

Objective-Cのオブジェクトプロパティにアクセスするための構文の追加は、.新しい機能が新しく見えるべきであるというObjective-Cの設計原則に違反しています。@[]メッセージ送信構文、およびObjective-Cオブジェクトを定義するための特別なキーワードを使用することは、Objective-Cが以前にこの設計原則に従った例です。

于 2012-05-21T11:07:04.707 に答える
1

これはobjective-cコードです。

@interface Foo : NSObject
{
  NSInteger _a;
}
@property (nonatomaic, assign) NSInteger a;
@end

@implement Foo
@synthesize a = _a;
@end

あなたは「@synthesize」フレーズを知っています。@synthesizeは以下のコードを作成します。

- (NSInteger)a
{
  return _a;
}


- (void)setA:(NSInteger)aa
{
  return _a = aa;
}

プロパティにアクセスしてみましょう。

void main()
{
  Foo foo = [[Foo alloc] init];
  foo.a = 1;
}

foo.aを1として割り当てる必要があります。ただし、コンパイラは次のように呼び出します。

void main()
{
  Foo foo = [[Foo alloc] init];
  [foo setA:1];
}

foo.a =1および[foosetA:1]は同じです。foo.a =1は[foosetA:1]を呼び出します。

ベロー、Cで書かれています。

class Foo
{
private:
  int _a;
public:
  int getA();
  void setA(const int aa);
};

int Foo::getA()
{
   return _a;
}
void Foo::setA(const int aa)
{ 
   _a = aa;
}

// local allocation example.

void main()
{
  Foo foo;
  foo.setA(1);
}

// Heap allocation example.
void main()
{
   Foo *foo = new Foo();
   foo->setA(1);
   delete foo;
}

// Pointer (like object objectve-c).
void main()
{
   Foo foo1;
   foo1.setA(1);

   Foo *foo2 = &foo1;
   foo2->setA(2);

   printf("result>>> %d, %d", foo1.a, foo2->a); 
}

result>>>  2, 2

foo1.aとfoo2->aも2です。以下のObjectve-Cの例。

void main()
{
   Foo *foo1 = [[Foo alloc] init];
   foo1.a = 1;

   Foo *foo2 = foo1;
   foo2.a = 2;

   NSLog(@"result>>> %d, %d", foo1.a, foo2.a);
}

result>>>  2, 2

良い一日を過ごしてください。ありがとうございました。

于 2012-05-29T16:10:06.160 に答える