2015-04-08 3 views
1

я получаю ошибку:Objective-C пользовательский класс

VertexPoint.m:12:1: Type of property 'color' ('GLfloat *' (aka 'float *')) does not match type of instance variable '_color' ('float [4]')

и

VertexPoint.m:12:1: Type of property 'position' ('GLfloat *' (aka 'float *')) does not match type of instance variable '_position' ('float [3]')

Что я должен сделать, чтобы решить это?

Вот код:

// 
// VertexPoint.m 

#import <Foundation/Foundation.h> 
#import "VertexPoint.h" 

@implementation VertexPoint 

- (id)init { 
    self = [super init]; 
    if (self) { 

     _position[0] = 1; 
     _position[1] = 2; 
     _position[2] = 3; 

     _color[0] = 1; 
     _color[1] = 2; 
     _color[2] = 3; 
     _color[3] = 4; 
    } 
    return self; 

}; 

- (GLfloat *)x { 
    return &_position[0]; 
}; 
- (GLfloat *)y { 
    return &_position[1]; 
}; 
- (GLfloat *)z { 
    return &_position[2]; 
}; 
- (GLfloat *)r { 
    return &_color[0]; 
}; 
- (GLfloat *)g { 
    return &_color[1]; 
}; 
- (GLfloat *)b { 
    return &_color[2]; 
}; 
- (GLfloat *)a { 
    return &_color[3]; 
}; 

- (void)setPosition:(GLfloat *)pos { 
    for (NSUInteger i = 0; i < 3; i++) 
     _position[i] = pos[i]; 
}; 
- (void)setColor:(GLfloat *)col{ 
    for (NSUInteger i = 0; i < 4; i++) 
     _color[i] = col[i]; 
}; 

@end 

и

// VertexPoint.h 
// 


#import <Foundation/Foundation.h> 
#import <OpenGLES/EAGL.h> 
#import <OpenGLES/ES1/gl.h> 
#import <OpenGLES/ES1/glext.h> 

@interface VertexPoint : NSObject 
{ 
    GLfloat _position[3]; 
    GLfloat _color[4]; 
} 
@property(nonatomic,readwrite) GLfloat *position; 
@property(nonatomic,readwrite) GLfloat *color; 
@property(nonatomic,readwrite) GLfloat *x; 
@property(nonatomic,readwrite) GLfloat *y; 
@property(nonatomic,readwrite) GLfloat *z; 
@property(nonatomic,readwrite) GLfloat *r; 
@property(nonatomic,readwrite) GLfloat *g; 
@property(nonatomic,readwrite) GLfloat *b; 
@property(nonatomic,readwrite) GLfloat *a; 

- (GLfloat *)x; 
- (GLfloat *)y; 
- (GLfloat *)z; 
- (GLfloat *)r; 
- (GLfloat *)g; 
- (GLfloat *)b; 
- (GLfloat *)a; 
-(void)setColor:(GLfloat *)col; 
-(void)setPosition:(GLfloat *)pos; 
@end 

ОБНОВЛЕНО РАЗ (2)

Новые ч и м файлы:

#import <Foundation/Foundation.h> 
#import <OpenGLES/EAGL.h> 
#import <OpenGLES/ES1/gl.h> 
#import <OpenGLES/ES1/glext.h> 

@interface VertexPoint : NSObject 
{ 
    GLfloat _position[3]; 
    GLfloat _color[4]; 
} 
@property(nonatomic,readwrite) GLfloat *position; 
@property(nonatomic,readwrite) GLfloat *color; 
@property(nonatomic,readonly) GLfloat x; 
@property(nonatomic,readonly) GLfloat y; 
@property(nonatomic,readonly) GLfloat z; 
@property(nonatomic,readonly) GLfloat r; 
@property(nonatomic,readonly) GLfloat g; 
@property(nonatomic,readonly) GLfloat b; 
@property(nonatomic,readonly) GLfloat a; 

- (GLfloat)x; 
- (GLfloat)y; 
- (GLfloat)z; 
- (GLfloat)r; 
- (GLfloat)g; 
- (GLfloat)b; 
- (GLfloat)a; 
-(void)setColor:(GLfloat *)col; 
-(void)setPosition:(GLfloat *)pos; 
@end 

и

#import <Foundation/Foundation.h> 
#import "VertexPoint.h" 

@implementation VertexPoint 

- (id)init { 
    self = [super init]; 
    if (self) { 

     _position[0] = 1.0f; 
     _position[1] = 1.0f; 
     _position[2] = 1.0f; 

     _color[0] = 1.0f; 
     _color[1] = 1.0f; 
     _color[2] = 1.0f; 
     _color[3] = 1.0f; 
    } 
    return self; 

}; 

- (GLfloat)x { 
    return _position[0]; 
}; 
- (GLfloat)y { 
    return _position[1]; 
}; 
- (GLfloat)z { 
    return _position[2]; 
}; 
- (GLfloat)r { 
    return _color[0]; 
}; 
- (GLfloat)g { 
    return _color[1]; 
}; 
- (GLfloat)b { 
    return _color[2]; 
}; 
- (GLfloat)a { 
    return _color[3]; 
}; 

- (void)setPosition:(GLfloat *)pos { 
    for (NSUInteger i = 0; i < 3; i++) 
     _position[i] = pos[i]; 
}; 
- (void)setColor:(GLfloat *)col{ 
    for (NSUInteger i = 0; i < 4; i++) 
     _color[i] = col[i]; 
}; 

@end 

Исходное сообщение об ошибке все еще существует.

+0

Почему все ваши свойства 'GLfloat' определены как указатели? 'GLfloat' - простой примитивный тип. – rmaddy

+0

не так ли? Это первый раз, когда я должен сделать что-то подобное, пожалуйста, научи меня :) – MegaX

+0

Когда он говорит: «Не соответствует типу переменной экземпляра« _color »(« float [4] ») и« не соответствует типу переменной экземпляра '_position' ('float [3]') «это расстроено, потому что вы пытаетесь заменить float указателем на float. Все эти звездочки, вероятно, не нужны при объявлении и возврате GLfloat. Если вам нужно использовать указатели, продолжайте и делайте это. Но вы не можете заменить float указателем float и притвориться, что это тот же тип данных. – Dare

ответ

0

Добавить:

- (GLfloat *)color { 
    return &_color[0]; 
} 

- (GLfloat *)position { 
    return &_position[0]; 
} 

в файл реализации .м.

То, что происходит в том, что вы объявили свойство color и position с типами GLfloat *, и у вас есть переменные экземпляра называется _color и _position. Компилятор хочет связать их вместе автоматически с помощью стандартного соглашения об именах-ivar, но эти несоответствия в типах (компилятор жалуется, потому что указатель float и массив поплавков не являются одинаковыми для этих целей; вы не можете верните массив в C.)

Если вы явно, добавьте методы getter, соответствующие свойствам, тогда вы можете явно указать отображение (и различную типизацию) самостоятельно, как я показал здесь. В этих двух случаях я просто вернул указатель на первый элемент массива. Вызывающему в этих случаях придется просто знать, что массив цветов имеет четыре элемента, а позиция одна имеет три.

+0

Я понимаю, спасибо, что он тоже работает :) – MegaX

+0

За исключением того, что не нужно проходить поплавки по указателю. –

+0

@HotLicks: Почему вы так говорите? Есть, конечно, другие способы разработки вершинного точечного класса OP, но я не понимаю, что такое запрет, как вы, кажется, делаете. (Пожалуйста, предоставьте контекст, особенно если вы проиграли. Спасибо.) –

Смежные вопросы