Digamos que tengo dos clases diferentes, ambos representan 2D datos de coordenadas de la misma manera interna como la siguiente:seguridad de la fundición entre los punteros de dos clases idénticas?
class LibA_Vertex{
public:
// ... constructors and various methods, operator overloads
float x, y
};
class LibB_Vertex{
public:
// ... same usage and internal data as LibA, but with different methods
float x, y
};
void foobar(){
LibA_Vertex * verticesA = new LibA_Vertex[1000];
verticesA[50].y = 9;
LibB_Vertex * verticesB = reinterpret_cast<LibB_Vertex*>(vertexA);
print(verticesB[50].y); // should output a "9"
};
Teniendo en cuenta las dos clases que son idénticos y la función anterior, puedo fiable contar con esta conversión puntero trabajando como se espera en todos los casos?
(El trasfondo es que necesito una forma fácil de intercambiar matrices de vértices entre dos bibliotecas separadas que tienen clases Vértice idénticas, y quiero evitar la innecesaria copia de matrices).
Otra forma bien definida de hacer estas conversiones es usar una unión con una secuencia inicial común (como lo permite el '§9.2/19'). – Mankarse
¡Oh! Bueno, C++ 11 al rescate. Solo espero que esta sea una de las cosas que VS2010 decidió agregar cuando salió a relucir el estándar. –
@Clairvoire: Esta es una de las cosas que siempre funcionó en la práctica, a pesar de estar prohibido formalmente. No espero que ningún escritor de compiladores tenga que "agregar" soporte. –