Program Object Management for an Engine (Kind of)

I have been working to fix up my sloppy code by wrapping a lot of it in classes and I think I’ve run into a problem with the Shader Objects because of the way they cannot be copied. At first I figured that since they are just referred to by an int, that there wouldn’t be any problem moving them around in an std::vector. I was wrong.

Here is the cpp. for my class. All it has is a string for the name of the shader and a GLuint that refers to the value you get after creating the program.

Shader::Shader(string name, GLuint program) {
mName = name;
mProg = program;
}

void Shader::Draw() {
glUseProgram(mProg);
}

string Shader::getName() {
return mName;
}

GLuint Shader::getProg() {
return mProg;
}

mShaders.emplace_back(new Shader(name, program));

^^ Is how I put the new Shader class object into a vector after going through the loading process for the code. Name is just a string given such as “Standard Blinn Phong”, and the program is the GLuint value that i was given from GL.

This is the place where my code breaks:
void Object::Draw() {
if(mMeshComponent != NULL)
{
GLuint prog = mMaterial->getShader()->getProg();
glUseProgram(prog); //This causes my application to stop and my debugger to stop.

    CAMERA_MANAGER->getActiveCamera()->Draw(prog);
    LIGHT_MANAGER->drawLights(prog);

    GLuint loc;
    loc = glGetUniformLocation(prog, "WorldMatrix");
    glUniformMatrix4fv(loc, 1, GL_FALSE, &mWorldMatrix[0][0]);

    mMaterial->Draw();

    mMeshComponent->Draw();
}
else
    cout << "Tried to draw object with no mesh" << endl;

}

I was looking else where on the forums and saw that using emplace_back might fix my problem, but I’m still crashing. Any help on fixing this or a better way to wrap and manipulate Program Objects would be greatly appreciated.