2

次のような状況があるとします。

class Vertex
{
public:
    Position position;
    Normal   normal;
    Texcoord texcoord;
    int      boneID;
};

class VertexSkinned: public Vertex
{
public:
    float boneWeights[3];
    int   boneIDs[3];
};

class VertexMorphed: public Vertex
{
public:
    Position posTargets[3];
    Normal   normTargets[3];
    Texcoord texcoordTargets[3];
};

std::vector<Vertex> vertices;

VertexSkinned vs;
VertexMorphed vm;
Vertex        v;

vertices.push_back( vs );
vertices.push_back( vm );
vertices.push_back( v );

// This is illegal right? But how would I go about achieving the desired effect
float someFloat = vertices.front().boneWeights[2];

質問はコメントにあります。私はめったに継承を使用せず、ここで有益な使用法を見つけたかもしれないと考えましたが、それは可能ではないようです。

ポインターのベクトルを使用してから、派生クラスへの動的キャストが機能すると思いますか? これは私がやりたいことではありません。

4

3 に答える 3

2

スライスの問題があります。sizeof(VertexSkinned) と sizeof(VertexMorphed) は sizeof(Vertex) と等しくなく、配列に挿入できません。代わりにポインタを使用してください

派生クラスのメンバーにアクセスするには、まず、指定された項目が派生型かどうかを判断する必要があります。1 つのオプションは、Base に GetType 関数を追加するか、dynamic_cast を使用することです。

于 2011-04-01T06:13:03.823 に答える
0

頂点配列がある場合、配列内のすべての頂点が同じタイプであると思います。これは、ポインターの格納と実行dynamic_castが時間の無駄であることを意味します。配列内のすべての頂点が保証されていることがわかっている場合、たとえば、VertexSkinnedを使用すると、より高速なを使用できるようになりますstatic_cast

個々の頂点へのポインタを格納すると、それらが1つの連続したメモリブロックに格納されないため、パフォーマンスが低下する可能性があります。

于 2011-04-01T06:36:55.173 に答える
0

派生オブジェクトを取得するために、ポインターと dynamic_cast を後で保存する以外に、他のオプションはありません。あなたが何かをしたいのなら、それぞれが独自のタイプを持つ3つの異なるベクトルを持つことはできませんか?その場合、ポインタ業務は必要ありません。

于 2011-04-01T06:15:11.163 に答える