2010-10-12 11 views
3

Je vais avoir des problèmes pour obtenir que cela fonctionne,de coulée void * à un tableau d'objets en C++

class A { 
public: 
    A(int n) { 
     a = n; 
    } 
    int getA() { 
     return a; 
    } 
private: 
    int a; 
}; 

int main(){ 

    A* a[3]; 
    A* b[3]; 

    for (int i = 0; i < 3; ++i) { 
     a[i] = new A(i + 1); 
    } 

    void * pointer = a; 

    b = (A* [])pointer; // DOESNT WORK Apparently ISO C++ forbids casting to an array type ‘A* []’. 
    b = static_cast<A*[]>(pointer); // DOESN'T WORK invalid static_cast from type ‘void*’ to type ‘A* []’ 

    return 0; 
} 

Et je ne peux pas utiliser des types génériques pour ce que je dois.

Merci d'avance.

+1

La variable 'b' est un tableau de 3 pointeurs. Pourquoi voulez-vous jeter un pointeur vide? – Arun

Répondre

10

Les tableaux sont des citoyens de seconde classe en C (et donc en C++). Par exemple, vous ne pouvez pas les affecter. Et il est difficile de les passer à une fonction sans les dégrader en pointeur vers leur premier élément.
Un pointeur sur le premier élément d'un tableau peut dans la plupart des cas être utilisé comme le tableau - sauf que vous ne pouvez pas l'utiliser pour obtenir la taille du tableau.

Lorsque vous écrivez

void * pointer = a; 

a est implicitement converti en un pointeur vers son premier élément, et qui est ensuite casté en void*.

De là, vous ne pouvez pas avoir le tableau arrière, mais vous pouvez obtenir le pointeur sur le premier élément:

A* b = static_cast<A*>(pointer); 

(Note: coulée entre des pointeurs vers des types non apparentés nécessite une reinterpret_cast, à l'exception des moulages à void* qui sont implicites et de void* à tout autre pointeur, ce qui peut être fait en utilisant un static_cast.)

6

peut-être vous dire faire

memcpy(b, (A**)pointer, sizeof b); 

? Une version static_cast est également possible.

+0

Ben, cela a fonctionné parfaitement. – SwatchPuppy

+0

Réservoirs beaucoup! – SwatchPuppy

+0

@Carlos: Si vous trouvez que cette réponse était ce dont vous aviez besoin, votez-la et acceptez-la (le chèque sous les votes). Je vous remercie. –