2012-06-14 3 views
0

Я пытаюсь создать массив атрибутов вершин для хранения векторов и индексов в сетке. Я понимаю, что атрибуты вершин могут быть составлены из vector2, vector3 и/или vector4, поэтому я хотел бы создать класс, который обслуживает их всех без ограничения методов для возврата определенного типа объекта. В качестве теста я написал следующий класс использования решений в NSMutableData:Как назначить разные типы данных для NSMutableData

//VertexAttributeArray.h 

@interface VertexAttributeArray : NSObject 
{ 
    NSMutableData *vertexData; 
} 

- (void *)data; 
- (CGRect *)rect; 

//VertexAttributeArray.m 

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

    if(self) 
    { 
     vertexData = [[NSMutableData alloc] initWithLength:0]; 
    } 

    return self; 
} 

- (void *)data 
{ 
    return [vertexData mutableBytes]; 
} 

- (CGRect *)rect 
{ 
    return [vertexData mutableBytes]; 
} 

- (void)dealloc 
{ 
    if(vertexData) 
    { 
     [vertexData release]; 
     vertexData = nil; 
    } 

    [super dealloc]; 
} 

Изнутри моего класса сетки, я хотел бы быть в состоянии назвать что-то вроде:

VertexAttributeArray *vertexAttributeArray = [[VertexAttributeArray alloc] init]; 

[vertexAttributeArray data][0] = CGRectMake(0.0, 0.0, 0.0, 0.0); //doesn't work - compiler error 
[vertexAttributeArray rect][0] = CGRectMake(0.0, 0.0, 0.0, 0.0); //works fine 

Первый метод, получающий доступ к data, был бы предпочтительнее, поскольку это не ограничивает класс работой с определенным типом структуры, но Xcode просто выдает предупреждение «Неполный тип« void »не присваивается».

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

Есть ли способ обойти это для создания агностического хранилища данных? Я бы предпочел, чтобы мой класс mesh имел разные объекты VertexAttributeArray для хранения вершин, индексов, нормалей и цветов и т. Д., Поэтому сохранение векторов2, vector3 и vector4 идеально, где бы я хотел быть. Как я буду работать над достижением этого?

ответ

0

Невозможно делать то, что вы хотите. Во время компиляции неизвестно, в каком размере находятся объекты внутри data. ((void *)foo)[x] был бы незаконным и в C. Компилятор должен знать, какая структура хранится внутри массива, чтобы вы могли его индексировать.

Вы можете изменить вызов:

((CGRect *)[vertexAttributeArray data])[0] = CGRectMake(0.0, 0.0, 0.0, 0.0); 

, если вы предпочитаете, с тех пор известно, что существует sizeof(CGRect) расстояние между объектами внутри data.

+0

Замечательный. Я думал, что так может быть. Большое спасибо за ваш ответ. – CaptainRedmuff