2012-08-23 62 views
2

我试图制作一个保存多种数据类型和向量的数据树。我至今如下所示: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; 
} 

现在这个编译很好,正是我想要的,但是,如果我尝试将值设置为一样的东西:

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

然后我得到出现以下错误:

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'| 

所以我错过了什么或者是我试图做不到的事情?

回答

6

Verts[3]类型VertStructNumberint所以这项分配是不可能的(与发布的代码)。你可以指定VertStruct成员之一作为分配对象:

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

如果你希望能够到int分配给你提供一个operator=(int)(由Luchian已经提到),但它一个VertStruct似乎对我来说这将是在调用点相当暧昧到什么成员(们)的int值被分配到:

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

我知道这是简单的东西我很想念,谢谢你指出:) – LucasS

3

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

VertStruct,你可以不为整数分配给它。

2

你失去了一些东西,这不是不可能的(一切都possib如果你能想象得到的话。这就是科学家的一切):)

Chunk[5]返回ChunkStruct

Chunk[5].LOD返回一个std::vector<LODStruct>

Chunk[5].LOD[4]返回一个LODStruct

Chunk[5].LOD[4].Verts返回std::vector<VertStruct>

最后,Chunk[5].LOD[4].Verts[3]返回VertStruct。你尝试给它分配一个int。显然,不会用你的代码。

为了使这个工作(这个确切的语法),你应该重载operator = (int x)。否则,将int分配给您想要的任何成员。

2

您正在将一个int的号码分配到VertStruct,这是一个struct,并且有3个字段(X,Y,Z)。如果你想设置X坐标,请执行以下操作:

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