Powiedzmy mam dwie różne klasy, zarówno reprezentacji danych współrzędnych 2D w taki sam sposób wewnętrznego tak:Bezpieczeństwo odlewania między wskazówkami dwóch identycznych klas?
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"
};
Biorąc pod uwagę dwie klasy są identyczne, a funkcja powyżej, mogę niezawodnie liczyć na tej konwersji wskaźnika działa w sposób oczekiwany w każdym przypadku?
(W tle potrzebuję prostego sposobu na handel tablicami wierzchołków między dwiema oddzielnymi bibliotekami, które mają identyczne klasy Vertex i chcę uniknąć niepotrzebnego kopiowania tablic).
Innym dobrze zdefiniowanym sposobem wykonywania tych konwersji jest użycie unii z typową początkową sekwencją (jak zezwala na to "§9.2/19"). – Mankarse
Oh! Cóż, C++ 11 na ratunek. Mam tylko nadzieję, że była to jedna z rzeczy, które VS2010 zdecydowało się dodać, kiedy poszła na wiśnie wybierając standard. –
@ Clairevoire: Jest to jedna z rzeczy, która zawsze działała w praktyce, nawet jeśli formalnie jest zabroniona. Nie oczekuję, że każdy twórca kompilatora musiałby "dodać" wsparcie. –