void*
-
Hallo,
kann mir bitte jemand ein anschauliches Beispiel geben, wo void* (Zeiger auf void) wirklich Sinn macht und dieses evtl. kurz erläutern? Danke im Voraus!

-
Die machen in C++ eigentlich gar keinen Sinn mehr, da man Templates hat. In C werden sie verwendet um Zeiger auf unbestimmte Daten zu halten.
-
Und würde es in C++ keine Templates geben... ...wofür würde void* denn dann eingesetzt werden? (suche konkreten Anwendungsfall) Danke im Voraus und gute Nacht.

-
mir fällt im moment nur die Verwendung bei createThread ein!!
bei der Thread Funktion, welche als einstiegstpunkt der Paralellprozesses verwendet wird, hat eine void* Parameter, weil im vornerein ja nicht gegeben ist welcher Datentyp der Thread Funktion übergeben wird!
DATENTYP X; //hier wird von X auf void* gecastet CreateThread (0,ThreadFunc,(void*)&X,CREATE_SUSPENDED,&_tid); //Thread Funktion static DWORD ThreadFunc(void* pData){ DATENTYP X= (X) *pData; //Hier wird von void* auf X gecastet }
-
rüdiger schrieb:
Die machen in C++ eigentlich gar keinen Sinn mehr, da man Templates hat. In C werden sie verwendet um Zeiger auf unbestimmte Daten zu halten.
In C++ ebenso, weil es Wahnsinn wäre jede Codestelle unnötig durch Templates zigfach duplizieren zu lassen bloss weil sie sonst void* rumreichen müsste.
Ein bisschen Realismus bitte
-
Hallo
Desweiteren macht void* noch Sinn für GUI-Controls mit Items zu denen jeweils noch Identifizierungsdaten mitverwaltet werden sollen. Beispiel : ListBox mit Städten die jeweils mit einer PLZ verknüft sein sollen, andereseits soll die Listbox die Städte automatisch sortieren. Dann kann man den Index/Zeiger/Wert... der PLZ als void* immer an das Item hängen.
Es gibt auch ListBox-Implementationen wo (zusätzlich) eine Basisklasse als Datenobjekt möglich ist, so das auch gleich der Speicher der Daten-Klassen von der ListBox verwaltet werden kann, zum Beispiel wxListBox. Hat natürlich den Nachteil das man wirklich immer ableiten muß.bis bald
akari
-
hustbaer schrieb:
rüdiger schrieb:
Die machen in C++ eigentlich gar keinen Sinn mehr, da man Templates hat. In C werden sie verwendet um Zeiger auf unbestimmte Daten zu halten.
In C++ ebenso, weil es Wahnsinn wäre jede Codestelle unnötig durch Templates zigfach duplizieren zu lassen bloss weil sie sonst void* rumreichen müsste.
Ein bisschen Realismus bitte
Hm. entweder du arbeitest in deinem speziellen Fall nur mit einem Datentyp, dann wird vom Template nur eine Intantiierung gemacht. Oder du hast verschiedene Datentypen, dann muesstest du bei der void* version aber mit irgendwelchen obszoenen if-elses oder switches arbeiten, was dan im Endeffekt nicht weniger Code ausmacht als die Mehrfachinstantiierung eines Templates - nur dass du den ganzen Code selbst tippen musst...
-
@hustbaer
okay, da hast du recht. Dann aber lieber in Form von boost::any :p
-
notebook schrieb:
Hallo,
kann mir bitte jemand ein anschauliches Beispiel geben, wo void* (Zeiger auf void) wirklich Sinn macht und dieses evtl. kurz erläutern? Danke im Voraus!

void* ist da sinnvoll, wo du zeiger auf "irgendwas" speichern willst. du legst damit nur eine adresse zu einem speicherbereich ab; die information in welchem format die daten vorliegen, geht dabei verloren.
das wird meistens benutzt, um nicht näher spezifizierte daten an objekte zu hängen.
class foo { public : void set_userdata(void *data) { userdata = data; } void* get_userdata() { return userdata; } private : void *userdata; }; int i = 12; Foo bar; bar.set_userdata(&i); // bar speichert zeiger auf i int j = *((int*)bar.get_userdata()); // j == i bar.set_userdata(&bar); // bar speichert zeiger auf sich selbst Foo *narf = (Foo*)bar.get_userdata(); // narf == barnachteil ist, du musst den void-pointer immer von hand in den ursprünglichen typ casten. das ist sehr fehleranfällig. deshalb sollte man solche konstrukte in c++ vermeiden, wo templates bessere (typsichere) möglichkeiten bieten.
-
pumuckl schrieb:
hustbaer schrieb:
rüdiger schrieb:
Die machen in C++ eigentlich gar keinen Sinn mehr, da man Templates hat. In C werden sie verwendet um Zeiger auf unbestimmte Daten zu halten.
In C++ ebenso, weil es Wahnsinn wäre jede Codestelle unnötig durch Templates zigfach duplizieren zu lassen bloss weil sie sonst void* rumreichen müsste.
Ein bisschen Realismus bitte
Hm. entweder du arbeitest in deinem speziellen Fall nur mit einem Datentyp, dann wird vom Template nur eine Intantiierung gemacht. Oder du hast verschiedene Datentypen, dann muesstest du bei der void* version aber mit irgendwelchen obszoenen if-elses oder switches arbeiten, was dan im Endeffekt nicht weniger Code ausmacht als die Mehrfachinstantiierung eines Templates - nur dass du den ganzen Code selbst tippen musst...
Neh, du verstehst nicht worum es mir geht.
Es geht um Programmstellen die bloss einen "Zeiger auf irgendwas" (vergleiche "dwUserdata" falls du jemals Windows programmiert hast) rumreichen müssen. Diese Stellen müssen garnix wissen, und den Cast kann man meist auch in einem sehr schlanken Template verstecken so dass der User ihn nicht schreiben muss. Das ist dann 1 Template wo ansonsten hunderte wären. Darum gehts.
-
rüdiger schrieb:
@hustbaer
okay, da hast du recht. Dann aber lieber in Form von boost::any :pBäh. Pfui. Spuck. Würg.
Wenn ich langsame programme will dann schreibe ich Python...