2016-05-13 7 views
0

ich an alle Daten des param Struktur als void* meiner Funktion:Wie kopiert man Daten aus void Zeiger in C++?

void func(void* param, size_t size) { 
    // here I need copy data from param 
    void * copy_data = malloc(size); 
    memcpy(copy_data, param, size); 
    ... 
} 

// call it like this 
func(&data, sizeof(data)); 

Wenn die param struct ist, und es ist wie das Objekt im Inneren:

struct data { 
    CustomClass object; 
}; 

Die memcpy die realen Daten nicht kopieren in object.

Gibt es eine Möglichkeit, echte Daten von void* zu kopieren? Wenn nicht, was sind die besten Praktiken? Ich denke da muss jemand eine solche Frage gestellt haben, ich kann es einfach nicht finden :-)

+0

Wie nennt man 'func' mit' data'? – Ajay

+2

Deep Copy Konstruktoren sind dafür ausgelegt. –

+0

@ Jean-BaptisteYunès Aber ich kann den Datentyp nicht von 'void *' bekommen, es wird viele Typen in 'func' geben. – zzy

Antwort

2

Können Sie stattdessen eine Vorlage verwenden?

template<class T> 
void func(T const& param) { 
    // here I need copy data from param 
    T copy_data = param; 
    ... 
} 

// call it like this 
func(data); 
+0

Danke, das wars! – zzy

3

Idealerweise darf man void* zusammen mit Strukturen und Klassen nicht verwenden. struct/class möglicherweise nicht POD (Plain Object Data - mit nur Daten, keine virtuellen Funktionen, Konstruktoren, Destruktoren, Vererbung etc.). Schreiben Sie lieber benutzerdefinierten Code, um Klassen zu kopieren, vorzugsweise innerhalb der Klasse selbst. Deshalb haben wir Kopierkonstruktoren, Zuweisungsoperatoren, die überschrieben werden müssen.

Später, wenn Sie mehr über Sprache wissen und lernen, können Sie vorlagenbasierten Code schreiben.

+0

Danke! Ich denke Vorlage ist was ich will. @Simple antwortete ealier, also werde ich seine Antwort akzeptieren :-) – zzy