Aunque ya has encontrado la solución, que efectivamente era esa, tienes que entender la razón por la cual funciona.
En lo que tenías antes:
Código C++:
Ver originalcube::cube (){
int x;
for (x = 0;x < 6;x++){
face test_face(x);
cube::faces[x] = &test_face;
}
}
Al crear la variable test_face de manera no dinámica y luego asignarle la dirección de memoria de esa variable en la siguiente línea a cube::faces[x], lo que estás haciendo es que en todas las vueltas del bucle le estás asignando la misma dirección de memoria y,al final, todas las caras del cubo van a apuntar a la misma cara. Si lo vieses con el depurador, te darías cuenta que el valor del array colores es 5 (el del último valor del bucle).
Al utilizar memoria dinámica esto se soluciona porque ahora sí estás asignando diferentes objetos a cada posición del array faces.
A lo mejor ya te has dado cuenta, pero así viene bien si alguien entra y lo ve y no sabe porque es.
Saludos