2012-08-23 3 views
2

J'essaie de créer un arbre de données contenant plusieurs types de données et vecteurs. Ce que j'ai jusqu'à présent est indiqué ci-dessous:Vecteurs et structures en C++

struct VertStruct{ 
    double X, Y, Z; 
}; 
struct FaceStruct{ 
    int F1, F2, F3, F4; 
}; 
struct FaceNormalStruct{ 
    double X, Y, Z; 
}; 
struct LODStruct{ 
    std::vector<VertStruct> Verts; 
    std::vector<FaceStruct> Faces; 
    std::vector<FaceNormalStruct> FaceNormals; 
}; 
struct ChunkStruct{ 
    std::vector<LODStruct> LOD; 
}; 

int main(){ 

    std::vector<ChunkStruct> Chunk; 
    Chunk.resize(100); 

    for(int i = 0; i < 100; i++) 
    { 
     Chunk[i].LOD.resize(5); 

     for(int j = 0; j < 5; j++) 
     { 
      Chunk[i].LOD[j].Verts.resize(36); 
      Chunk[i].LOD[j].Faces.resize(25); 
      Chunk[i].LOD[j].FaceNormals.resize(25); 
     } 
    } 
return 1; 
} 

Maintenant, ce compile bien et est exactement ce que je veux, mais si je tente de définir une valeur à quelque chose comme:

int Number = 42; 
Chunk[5].LOD[4].Verts[3] = Number; 

Puis-je obtenir l'erreur suivante:

main.cpp|126|error: no match for 'operator=' in 'Chunk.std::vector<_Tp, _Alloc>::operator[] [with _Tp = ChunkStruct, _Alloc = std::allocator<ChunkStruct>](5u)->ChunkStruct::LOD.std::vector<_Tp, _Alloc>::operator[] [with _Tp = LODStruct, _Alloc = std::allocator<LODStruct>](4u)->LODStruct::Verts.std::vector<_Tp, _Alloc>::operator[] [with _Tp = VertStruct, _Alloc = std::allocator<VertStruct>](3u) = Number'| 

Alors, est-ce que je manque quelque chose ou est-ce que ce que j'essaie de faire n'est pas possible?

Répondre

6

Verts[3] est de type VertStruct et Number est un int de sorte que la cession n'est pas possible (avec le code affiché). Vous pouvez spécifier l'un des membres de VertStruct comme cible de la mission:

Chunk[5].LOD[4].Verts[3].X = Number; 

Si vous voulez être en mesure d'attribuer un int à un VertStruct vous fournir un operator=(int) (comme déjà mentionné par Luchian) mais il semble pour moi, ce serait tout à fait ambiguë sur le site d'appel à ce membre (s) la valeur int est attribuée à:

struct VertStruct 
{ 
    double X, Y, Z; 
    VertStruct& operator=(int d) 
    { 
     X = d; // Or 'Y' or 'Z' or all. 
     return *this; 
    } 
}; 
+0

Je savais que c'était quelque chose de simple que je manquais, merci de l'avoir signalé :) – LucasS

3

Ce

Chunk[5].LOD[4].Verts[3] 

est un VertStruct, et vous ne pouvez pas attribuer un entier à lui.

2

il vous manque quelque chose, et il est impossible (la possib de tout le si tu peux l'imaginer. C'est en quoi consiste le fait d'être un scientifique) :)

Chunk[5] renvoie ChunkStruct.

Chunk[5].LOD renvoie std::vector<LODStruct>.

Chunk[5].LOD[4] renvoie LODStruct.

Chunk[5].LOD[4].Verts renvoie un std::vector<VertStruct>.

Enfin, Chunk[5].LOD[4].Verts[3] renvoie VertStruct. Et vous essayez de lui attribuer un int. De toute évidence, ne va pas travailler avec votre code.

Pour que cela fonctionne (cette syntaxe exacte), vous devez surcharger operator = (int x). Sinon, affectez le int au membre de votre choix.

2

Vous affectez un numéro qui est un int en VertStruct, qui est un struct et comporte 3 champs (X, Y, Z). Si vous vouliez définir des coordonnées X, faites:

Chunk[5].LOD[5].Verts[3].X = Number;