Правильный синтаксис для доступа к массиву объектов в стиле c через цель-c сообщениями? - PullRequest
3 голосов
/ 22 июня 2010

Пожалуйста, смотрите комментарий:

static void drawAnObject() {
    Form *form = [[Form alloc] init];
    int i;

    [form randomizeCube];
    glColor3f(0.0, 0.0, 0.0);

    for(i = 0; i < MAX_CUBE; i++) {
        glutWireCube(form->cube[i]->size); 
            //compiler issues hard warning because form->cube is protected!!
    }
}

Я бы предпочел использовать метод доступа, который я поместил в класс "Форма", чтобы я мог написать что-то вроде:

glutWireCube([[form cube][i] size]);

Но я получаюошибка «невозможно преобразовать в тип указателя», когда я пытаюсь скомпилировать это.

Это мой метод доступа в классе «Форма»:

@implementation Form
- (Cube *) cube {
    return *cube;
}

Определена переменная «куб»в заголовочном файле класса "Form" следующим образом:

@interface Form : NSObject <NSCopying> {
    Cube *cube[MAX_CUBE];
}

Ниже перечислены переменные класса "Cube", определенные в его заголовочном файле:

@interface Cube : NSObject <NSCopying> {
    double size;
    double positionX;
    double positionY;
    double positionZ;
}

...и соответствующие средства доступа в файле реализации (.m):

- (double) size {
    return size;
}

- (void) setSize: (double) newSize {
    size = newSize;
}

- (double) positionX {
    return positionX;
}

- (void) setPositionX: (double) newPositionX {
    positionX = newPositionX;
}

- (double) positionY {
    return positionY;
}

- (void) setPositionY: (double) newPositionY {
    positionY = newPositionY;
}

- (double) positionZ {
    return positionZ;
}

- (void) setPositionZ: (double) newPositionZ {
    positionZ = newPositionZ;
}

Я бы хотел избежать использования NSMutableArray или NSArray, так как позже я планирую перенести эту часть кода проекта на платформы, не относящиеся к Cocoa..

Последние пару часов я потратил на поиски правильного способа сделать это.Есть ли «правильный способ» сделать это, используя массивы в стиле C и методы доступа Objective-C?

1 Ответ

1 голос
/ 23 июня 2010

В вашем методе доступа отсутствует звездочка.Это сложно, потому что вы не можете возвращать типы массивов из методов в C или Objective-C.Попробуйте это:

@implementation Form
- (Cube **) cube {
    return &cube[0]; // alternatively just "return cube;" will suffice
}
@end

Возвращает указатель на указатель, поэтому, когда вы подпишите его с помощью [form cube][i], вы все равно останетесь с типом указателя, а в Objective-C получатели должны быть указателями.Это должно позволить вам сделать

glutWireCube([[form cube][i] size]);
...