2012-08-23 94 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;