0

ベクトルとインデックスをメッシュに格納するための頂点属性配列を作成しようとしています。頂点属性は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を格納するのが理想的です。これを達成するにはどうすればよいですか?

4

1 に答える 1

0

あなたがやりたいことをする方法はありません。コンパイル時にdataは、内部のオブジェクトのサイズはわかりません。((void *)foo)[x]Cでも違法です。コンパイラは、インデックスを作成できるように、配列内に格納されている構造体を認識している必要があります。

呼び出しを次のように変更できます。

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

sizeof(CGRect)必要に応じて、それ以降、内部のオブジェクト間に距離があることがわかっていますdata

于 2012-06-14T10:20:54.880 に答える