2012-05-21 3 views
6

저는 Box2D 프로그래밍을하고 있고, 머리를 감고 있습니다. 나는 C++과 C의 전체적인 멍청한 존재입니다. 저는 Objective-C 녀석입니다. 나는 언어를 이해하기가 정말로 어렵다. 특히 :C의 -> Objective-C의 점 표기법과 동일합니다.

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

는 대물-C로 표기 도트이 동등하다 : 기본적

-> 

I이 상이한 방법이나 함수 또는 변수/아래와 같은 특성을 참조하는 데 사용되는 것을 이해

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

또는

[self destroyBody:body.world]; 

다른 이름이 있습니까? 나는 이것을 정말로 이해하지 못한다. 누군가가 내게이게 뭔지에 대해 머리를 알려줄 수 있습니까? 감사!

+1

AFAIK Objective-C에는'->'도 있습니다. –

+0

'->'는 C에서 온 것입니다. – Pubby

+0

아, ok 씨. – MCKapur

답변

10

Objective-C를 모르지만 C 및 C++에서 ->.의 차이점을 설명 할 수 있습니다.

.은 struct/class 인스턴스의 멤버에 액세스 할 수있는 연산자입니다. a->b(*a).b과 동일하므로 먼저 포인터를 역 참조 한 다음 포인터가 가리키는 인스턴스 구성원에 액세스합니다.

또한 Luchian이 언급 한 경우가 있습니다. 주어진 클래스의 operator->() 오버로드입니다. 사용중인 클래스가이 연산자에 과부하를 일으키는 경우, 클래스에 의해 정의 된 동작이 달라집니다. 실제로 원하는 모든 것을 반환 할 수 있습니다.

+0

그 수치, 대답 해줘서 고마워! 9 분 안에 진드기가 있고, 할 수있을 때 – MCKapur

+1

@RohanKapur 이것은 항상 사실이 아닙니다. –

+0

객관적인 C에 연산자 오버로딩이 전혀 없습니다.) –

4

내가 목표 - C에 대해 잘 모르겠지만, 나는 C++에 대한 몇 가지 도움을 제공하기 위해 시도 할 수 있습니다 :

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

경우 : 방법 bar() 당신이, C++에서 클래스 Foo를 정의한다고 가정

Foo f; 
f.bar(); 
: 당신이 스택에 Foo 의 인스턴스를 할당, 당신은 ( .)이 방법 bar() 전화 점 표기법을 사용 당신이 Foo의 인스턴스에 포인터이있는 경우

, 당신은 방법 bar() 호출 할 화살표 표기 (->)를 사용 :

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

(일을 복잡하게하기 위해, 참조도 있습니다, 값 구문과 포인터 의미를가집니다. Foo (예 : Foo& f) 당신은 여전히 ​​점 표기법을 사용합니다. f.bar();)

+2

스택 및 힙 할당은'-> '또는'.'을 사용하는 것과 아무 관계가 없습니다. 중요한 것은 사용되는 표현식의 유형뿐입니다. – akappa

+0

@akappa : 도트 대 화살표 구문의 개념을 설명하기 위해 몇 가지 구체적인 예를 제시했습니다. stack ('Foo f;')에'Foo'를 할당하고 그'Foo' ('Foo * pf = & f;')에 대한 포인터를 가지고 있다면 여전히 구문이'pf-> bar() ;'. 나는 언어 초보자에게 가능한 한 간단하게 설명하고 혼란을 피하려고 노력한다. –

+0

"모든 것이 가능한 한 간단해야하지만 단순하지는 않습니다." 일반적인 예를 만드는 것은 괜찮습니다. 예를 들어 열거하는 것만으로 간단하게 만들려고 시도하는 것은 끔찍한 잘못이며 잠재적으로기만적인 행위입니다. 특히 그 예일 뿐이라고 명시 적으로 말하지 않은 경우 특히 그렇습니다. 예를 들어, 그는'Foo * x = new Foo(); Foo & y = * x; y-> method();'또는'Foo x; Foo * y = & x; y.method();'그리고 왜 작동하지 않는지 궁금합니다. – akappa

2

.->는 포인터를 통해 액세스 회원들에게 사용되는 객체의 멤버에 액세스하는 데 사용됩니다. 보통입니다.operator ->는 당신은 또한 객체에서 사용할 수 있음을 의미 오버로드 할 수 있습니다

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

X x; 
x->other; 

, x->otherx.other에 reffer하지 않지만, x.other.other합니다. D

+0

연산자 오버로드에 대한 좋은 점은 완전히 놓쳤습니다. – Griwes

+0

객관적인 C에는 연산자가 오버로드되지 않습니다.) –

+0

@VictorCarmouze가 거기에 없다고 말하면 ... –

2

아니요, Objective-C 속성에 액세스하는 데 .을 사용하면 -> 또는 .과 같지 않아 C 및 C++의 struct 및 클래스 멤버에 액세스 할 수 없습니다.

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가 이전에이 디자인 주체를 따라 한 사례가됩니다.

1

이것은 객관적인 코드입니다.

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

@implement Foo 
@synthesize a = _a; 
@end 

당신은 '@ 합성'구를 알고 있습니다. @synthesize 벨로우즈 코드 생성.

- (NSInteger)a 
{ 
    return _a; 
} 


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

속성 a에 액세스 해 보겠습니다. 1. 그러나 울부 짖는 소리와 같은 컴파일러 호출로

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

에서 꼭 할당 foo.a.

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

foo.a = 1이고 [foo setA : 1]은 같습니다. foo.a = 1은 [foo setA : 1]을 호출합니다.

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- C. 작성된

벨로는>은도 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 

좋은 하루 보내십시오. 감사합니다.

관련 문제