我正在尝试创建一个顶点属性数组,用于在网格中存储矢量和索引。我意识到顶点属性可以由vector2,vector3和/或vector4组成,所以我想创建一个适合它们的类,而不需要约束方法来返回某种类型的对象。作为测试,我编写了以下课程,使用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'不可分配。”
我不想为不同类型的数据结构提供多种方法,但我目前无法找到解决此问题的方法。拥有返回指向不同类型的指针的方法看起来并不是很优雅,并且添加了大量未使用的(和不需要的)代码。
有没有办法解决这个问题,以创建一个不可知的数据存储?我更喜欢我的网格类有不同的VertexAttributeArray
对象来存储顶点,索引,法线和颜色等,所以存储vector2,vector3和vector4是理想的我想成为的地方。我将如何解决这个问题呢?
答案 0 :(得分:0)
没有办法做你想做的事。在编译时不知道data
内的对象的大小。 ((void *)foo)[x]
在C中也是非法的。编译器必须知道数组中存储了什么结构,以便能够为其编制索引。
您可以将通话更改为:
((CGRect *)[vertexAttributeArray data])[0] = CGRectMake(0.0, 0.0, 0.0, 0.0);
如果您愿意,从那时起就知道sizeof(CGRect)
内的对象之间有data
距离。