类对象未正确修改其他类对象

时间:2019-06-18 19:49:49

标签: c++ class

我正在尝试创建一个执行以下操作的Model类: -创建一个Mesh类实例 -调用创建的Mesh对象的addVertex函数 -调用创建的Mesh对象的addTriangle函数

Mesh类有两个向量,函数添加了两个向量,但是当我在main.cpp中打印内容时,它们是空的。

这是我的代码:

模型类:

class Model 
{
public:
    /*  Model Data */
    /...

    //using default constructor

    Mesh createMesh() {
        Mesh mesh;
        meshes.push_back(mesh);
        return mesh;
    }

    void addVertex(Mesh mesh, Vertex v) {
        mesh.addVertex(v);
    }
    void addTriangle(Mesh mesh, Vertex a, Vertex b, Vertex c) {
        mesh.addTriangle(a,b,c);
    }
/...

网格类:

class Mesh {
public:
    /*  Mesh Data  */
    vector<Vertex> vertices;
    vector<unsigned int> indices;
    /...
// constructor
    Mesh(vector<Vertex> vertices, vector<unsigned int> indices, vector<Texture> textures)
    {
        this->vertices = vertices;
        this->indices = indices;
        this->textures = textures;
        for (Vertex v: vertices) {
            pairings.insert( std::pair<Vertex,unsigned int>(v,count) );
            count++;
        }
        setupMesh();
    }
    Mesh () {

    }

    //function 1
    void addVertex(Vertex vertex) {
        vertices.push_back(vertex);
        pairings.insert( std::pair<Vertex,unsigned int>(vertex,count));
        count++;
    }

    //function 2
    void addTriangle(Vertex a, Vertex b, Vertex c) { 
        unsigned int index = pairings[a];
        indices.push_back(index);
        index = pairings[b];
        indices.push_back(index);
        index = pairings[c];
        indices.push_back(index);
        setupMesh();
    }

main.cpp:

Model m;
    Mesh mesh = m.createMesh();
    Vertex a;
    a.Position = glm::vec3 (-1,0,0);
    m.addVertex(mesh, a);
    Vertex b;
    b.Position = glm::vec3 (0,1,0);
    m.addVertex(mesh,b);
    Vertex c;
    c.Position = glm::vec3 (1,0,0);
    m.addVertex(mesh,c);
    m.addTriangle(mesh,a,b,c);
    std::cout << mesh.indices.size(); //prints 0


任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

我相信是因为在Model类中的addVertexaddTriangle方法上,您是通过值而不是引用或指针来传递参数。这意味着,当您调用该方法时,将传递MeshVertex对象的副本,并且在方法执行完成后,您在方法内部所做的任何更改都会丢失。尝试以下更改:

void addVertex(Mesh &mesh, Vertex &v) {
    mesh.addVertex(v);
}
void addTriangle(Mesh &mesh, Vertex &a, Vertex &b, Vertex &c) {
    mesh.addTriangle(a,b,c);
}

有关通过引用传递的更多信息,请参阅following