2012-10-27 6 views
0

나는 Objective C에서 상당히 새롭고 C++에 익숙하기 때문에 혼란 스러울 수 있습니다. 나는 아이폰 게임을 만들고 있는데, 내가하고 싶은 일은 모든 적과 영웅이 "등록"하고 "등록 해제"하는 클래스를 갖는 것입니다. 적과 영웅의 각각의 인스턴스를이 싱글 톤 클래스에 전달한 다음 NSMutableArray에 객체를 추가하고 각 특정 인스턴스 내에서 함수를 호출하고 변수를 변경할 수 있어야합니다 (registerID를 기반으로 for 루프를 사용). 아무도이 질문에 대답하는 것 같지 않은 적 개체의 포인터를 전달하려고 시도 할 때 오류가 발생했습니다. "(damageistributer.h에 있음). 어떻게이 작업을 수행 할 수 있습니까? ..매개 변수로 self 전달하기

DamageDistributer.h

@interface DamageDistributer : NSObject { 

    GLuint enemyRegisterID; 
    GLuint heroRegisterID; 

    NSMutableArray *enemies; 
    NSMutableArray *heros; 
} 

- (void)RegisterHero:(Player*)playerHero; //PROBLEM HERE 
- (void)RegisterEnemy:(AbstractEnemy*)enemyUnit; //PROBLEM HERE 
- (void)Unregister:(GLuint)registerID type:(GLuint)typeOfEntity; 

+ (DamageDistributer*)sharedDamageDistributer; 

: 나는 변수를 변경하면 내가 변경 사항을 잃지 말고 사전에 감사 여기 스택에있는 객체의 복사본을 원하지 않는 것은 몇 가지 코드 DamageDistributer.m

- (void)RegisterHero:(Player *)playerHero { 

    [heros addObject:playerHero]; 
    playerHero.damageDistID = heroRegisterID; 
    heroRegisterID++; 
} 

- (void)RegisterEnemy:(AbstractEnemy *)enemyUnit { 

    [enemies addObject:enemyUnit]; 
    enemyUnit.damageDistID = enemyRegisterID; 
    enemyRegisterID++; 
} 

- (void)Unregister:(GLuint)registerID type:(GLuint)typeOfEntity { 

    if (typeOfEntity == hero) { 
     [heros removeObjectAtIndex:registerID]; 
    } 
    else { 
     [enemies removeObjectAtIndex:registerID]; 
    } 
} 

그리고 이것은 En의 전화입니다. emy 클래스

sharedDamageDistributer = [DamageDistributer sharedDamageDistributer]; 
[sharedDamageDistributer RegisterEnemy:self]; 

그래서 내가 뭘 잘못하고 있니?

편집 됨 : 오 와우가 간과 한 ... 감사합니다. 그 이상이라고 생각했습니다. 한 가지 더 묻습니다. 개체가 배열에서 제거되면 변경 가능한 배열은 인덱스를 이동시킬 것인가? 그래서 제거 된 후에 모든 개체 (registerIDs)를 감소시켜야합니까? 아니면 인덱스를 유지하고 공백을 채 웁니 까? 아니면 아무것도 바꾸지 않고 끝까지 계속 추가할까요? 다시 한번 감사드립니다.

+0

에 실패하고 수, 그것은 괜찮습니다, 그것에 대해 걱정하지 마십시오. –

+1

Tangent : ObjC 컨벤션은'PascalCase'가 아니라 메소드 이름에 대해'camelCase'라고 생각합니다. – millimoose

답변

3

헤더가 Player 및 AbstractEnemy에 대해 알지 못하는 것 같습니다. 이 두 헤더를 가져 오거나 컴파일러에 해당 이름의 클래스가 있음을 알리는 @class (forward declaration)를 추가 할 수 있습니다. 그리고 물론 당신이 DamageDistributer

@class Player; 
    @class AbstractEnemy; 
    @interface DamageDistributer : NSObject { 

     GLuint enemyRegisterID; 
     GLuint heroRegisterID; 

     NSMutableArray *enemies; 
     NSMutableArray *heros; 
    } 

    - (void)RegisterHero:(Player*)playerHero; //PROBLEM HERE 
    - (void)RegisterEnemy:(AbstractEnemy*)enemyUnit; //PROBLEM HERE 
    - (void)Unregister:(GLuint)registerID type:(GLuint)typeOfEntity; 

    + (DamageDistributer*)sharedDamageDistributer; 
1

의 구현에서 그 헤더를 가져올 나는 헤더에 사용자 정의 클래스를 인식하지 못할 것이라고 생각합니다. 같은, 당신의 .h 파일에 선언을 추가 (등 INT, 엄격한 같은 기본 C 타입 제외) 목적-C 모두에서

@class Player; 
@class AbstractEnemy; 
1

은 힙에 있습니다. 모든 객체는 힙에 있으며 메모리 관리를 위해 참조 포인터 (예 : 스마트 포인터)를 사용합니다.

귀하의 오류가 있지만이 관련이없는 모양, 그리고 자기를 호출하는 클래스 유형 AbstractEnemy의 경우 그냥 #import "Player.h"

관련 문제