2013-06-10 1 views
-2

두 클래스 인 Vertex와 Triangle이 있습니다. 먼저 꼭지점 필드를 만든 다음 꼭지점 필드에서 삼각형면의 벡터를 만듭니다. 각 정점에는 인접한 각 삼각형면에 대한 포인터 또는 참조가 필요합니다.각 개체의 벡터가 그것의 멤버에게 전달

다음은 내가 가진 간단한 예제입니다. 그러나 작동하지 않습니다.

struct Vertex { 
    float x, y, z; 
    vector<Triangle*> adj_triangles; 
} 

struct Triangle { 
    Vertex *v1; 
    Vertex *v2; 
    Vertex *v3; 

    Triangle(Vertex *v1_in, Vertex *v2_in, Vertex *v3_in) { 
     v1 = v1_in; 
     v2 = v2_in; 
     v3 = v3_in; 
     v1->adj_triangles.push_back(this); 
     v2->adj_triangles.push_back(this); 
     v3->adj_triangles.push_back(this); 
    } 
} 

struct Mesh { 
    vector< vector<Vertex> > field; 
    vector<Triangle> triangles; 
} 

그리고 이렇게 채우기하고, 물론 V1, V2, V3는 정점 객체에 대한 유효한 포인터

triangles.push_back(Triangle (v1, v2, v3)); 

.

나는이 같은 정점에서 삼각형에 액세스하려고

,

v.adj_triangles[index]->member; 

내가 원하는 것을 얻을하지 않습니다. 임시 삼각형을 먼저 밀면 임시로이 포인터에 따라 값이 초기화되기 때문에 이것이 아마 생각합니다. 그리고 나서 그것은 값에 의해 복사되고 파괴됩니다. 따라서 각 꼭지점에는 더 이상 존재하지 않는 객체에 대한 포인터가 있습니다.

그래서 나는 이것을 달성하는 방법이 무엇인지 궁금해하고 있었습니까? 스마트 포인터 벡터를 사용해야합니까?

시간 내 주셔서 감사합니다.

편집 :

그냥 내가 요구하고 무엇을 더 명확하게하고 싶었다. 코드가 올바로 작동하지 않는 이유에 대한 내 분석입니까? 이거 어떻게 생각해?

struct Triangle { 
    Vertex *v1; 
    Vertex *v2; 
    Vertex *v3; 

    Triangle(Vertex *v1_in, Vertex *v2_in, Vertex *v3_in) { 
     v1 = v1_in; 
     v2 = v2_in; 
     v3 = v3_in; 
    } 
    void give_address() { 
     v1->adj_triangles.push_back(this); 
     v2->adj_triangles.push_back(this); 
     v3->adj_triangles.push_back(this);  
    } 
} 

... 문제를 해결

triangles.push_back(Triangle (v1, v2, v3)); 
triangles.back().give_address(); 

. 그러나 이것이 나쁜 관행인지 궁금합니다.

+0

를 저장하는 가장 좋은거야? – Naveen

+0

그들은 (int j = 0; j MVTC

+0

음,'Mesh'는 포인터 대신 구조체 복사본을 생성하는'vector '와'벡터 '을 사용합니다. – nneonneo

답변

2

push_back 크기가 조정될 때 vector의 공간이 충분하지 않으면 이전에 vector에 있었던 값에 대한 포인터가 무효화됩니다.

값 자체가 아닌 크기 조정 포인터를 값에 저장하거나 저장할 필요가 없도록 올바른 크기를 예약해야합니다.

당신이 포인터 경로를 이동하는 경우, 당신은 어떻게 당신이`V1, V2, v3` 객체를 생성되어 unique_pointer

+0

내가 물어서 기뻐. 나는 이것을 몰랐다. 이 문제가 내가 겪고있는 문제의 원인이 될 수는 없지만 나중에 문제가 생겼을 가능성이 큽니다. 나는 물어 보지 않았다면, 나는 나의 수정을 구현했을 것이고, 아마도 느린 문제에 관해서는 결코 알지 못했을 것이다. 나는 unique_ptr을 사용했다. 감사. – MVTC

관련 문제