Указатель на поведение контейнера STL - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть этот класс:

class Model3D
{
public:
    void AddVert( Vec3D vert ) { vertices.push_back( vert ); }
    void AddTri( Vec3D *v_0, Vec3D *v_1, Vec3D *v_2 );
    void Draw( HDC hdc );

    std::vector<Vec3D> vertices;
    std::vector<Triangle3D> polys;
};

Также важно, чтобы тип Triangle3D был определен следующим образом: (он маленький, потому что он еще не закончен)

class Triangle3D
{
public:
    Vec3D  *verts[3];

};

Кроме того, вотAddTri ()

void Model3D::AddTri( Vec3D *v_0, Vec3D *v_1, Vec3D *v_2 )
{
Triangle3D triangle;
triangle.verts[0] = v_0;
triangle.verts[1] = v_1;
triangle.verts[2] = v_2;

polys.push_back( triangle );
}

Вершины членам даны начальные значения.Глядя на эти элементы в отладке через указатели в Triangle3D , эти значения отображаются правильно

Наконец, я пытаюсь изменить элементы вершин здесь:

std::vector<Vec3D>::iterator j;

for (j = vertices.begin(); j != vertices.end(); ++j)
    {
    j->x = ( j->x ) / ( j->z );
    j->y = ( j->y ) / ( j->z );
    }

После завершения этого цикла, используя отладчик, если я проверяю вектор вершин , члены изменяются так, как ожидается.Тем не менее, когда я проверяю указатели на эти члены в классе Triangle3D , они остаются неизменными.Почему это так?

РЕДАКТИРОВАТЬ вот фрагмент добавляемых вершин и треугольников (определяет куб):

Model3D Cube( Vec3D center, int size )
{
Vec3D vert;
Model3D model;

vert.z = .5;

vert.x = center.x - (float)( 0.5f * size );
vert.y = center.y + (float)( 0.5f * size );

model.AddVert( vert );

vert.x = center.x + (float)( 0.5f * size );
vert.y = center.y + (float)( 0.5f * size );
model.AddVert( vert );

vert.x = center.x + (float)( 0.5f * size );
vert.y = center.y - (float)( 0.5f * size );
model.AddVert( vert );

vert.x = center.x - (float)( 0.5f * size );
vert.y = center.y - (float)( 0.5f * size );
model.AddVert( vert );

vert.z = 1;
//center.x += 120;
//center.y += 120;

vert.x = center.x - (float)( 0.5f * size );
vert.y = center.y + (float)( 0.5f * size );

model.AddVert( vert );

vert.x = center.x + (float)( 0.5f * size );
vert.y = center.y + (float)( 0.5f * size );
model.AddVert( vert );

vert.x = center.x + (float)( 0.5f * size );
vert.y = center.y - (float)( 0.5f * size );
model.AddVert( vert );

vert.x = center.x - (float)( 0.5f * size );
vert.y = center.y - (float)( 0.5f * size );
model.AddVert( vert );

//front
model.AddTri( &model.vertices[0], &model.vertices[1], &model.vertices[2] );
model.AddTri( &model.vertices[2], &model.vertices[3], &model.vertices[0] );

//top
model.AddTri( &model.vertices[4], &model.vertices[5], &model.vertices[1] );
model.AddTri( &model.vertices[1], &model.vertices[0], &model.vertices[4] );

//bottom
model.AddTri( &model.vertices[3], &model.vertices[2], &model.vertices[6] );
model.AddTri( &model.vertices[6], &model.vertices[7], &model.vertices[3] );

//left

model.AddTri( &model.vertices[4], &model.vertices[0], &model.vertices[3] );
model.AddTri( &model.vertices[3], &model.vertices[7], &model.vertices[4] );

//right
model.AddTri( &model.vertices[1], &model.vertices[5], &model.vertices[6] );
model.AddTri( &model.vertices[6], &model.vertices[2], &model.vertices[1] );

//back
model.AddTri( &model.vertices[5], &model.vertices[4], &model.vertices[7] );
model.AddTri( &model.vertices[7], &model.vertices[6], &model.vertices[5] );

return model;
}

А вот метод Draw:

void Model3D::Draw( HDC hdc )
{
std::vector<Triangle3D>::iterator i;
std::vector<Vec3D>::iterator j;

for (j = vertices.begin(); j != vertices.end(); ++j)
    {
    j->x = ( j->x ) / ( j->z );
    j->y = ( j->y ) / ( j->z );
    }

for (i = polys.begin(); i != polys.end(); ++i)
    {
    DrawLine( hdc, *i->verts[0], *i->verts[1], WHITE );
    DrawLine( hdc, *i->verts[1], *i->verts[2], WHITE );
    DrawLine( hdc, *i->verts[2], *i->verts[0], WHITE );
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...