Statische Variablen für mehrere "Instanzen" einer Funktion
-
Nein, die WinApi ist voll von OOP-Konzepten.
Ob das jetzt genau in die Definition von OOP passt sei mal dahingestellt. Das war mehr als Hinweis gedacht, dass dort genau sein Problem adressiert ist.In der Funktion fehlt einfach das Objekt.
-
Für ein Windowsprogramm braucht man kein OOP zu kennen. Ein Windowsprogramm lässt sich ohne Objekte mit C Code erstellen. Eine Struktur als 'Objekt' reicht aus.
-
Man braucht also keine Objekte denn Objekte reichen aus?
Darum gehts in der OOP. Objekt orientierte Programmierung.
-
DrGreenthumb schrieb:
Man braucht also keine Objekte denn Objekte reichen aus?
Objekt != 'Objekt'
Ja, man braucht kein Objekte, eine Struktur reicht aus. Genau genommen braucht man nicht einmal eine Struktur. Man hat dann bloß nicht allzu viel von Windows.
Hier ist ein Beispiel für ein Windowsprogramm mit einer Struktur.
http://www.winprog.org/tutorial/simple_window.htmlHier ist ein Beispiel für ein Windowsprogramm ohne eine Struktur.
http://www.winprog.org/tutorial/start.html
-
Big Brother schrieb:
DrGreenthumb schrieb:
Man braucht also keine Objekte denn Objekte reichen aus?
Objekt != 'Objekt'
eben nicht.
Hier ist ein Beispiel für ein Windowsprogramm ohne eine Struktur.
http://www.winprog.org/tutorial/start.htmlMessageBox nimmt als ersten Parameter ein HWND als Parent. Das ist ein Objekt.
Jedes Hello-World schreibt auf STDOUT. Das ist auch ein Objekt.
-
Meine Aussage war eigentlich ganz einfach gemeint, ich versuche sie noch einmal umzuformulieren, villeicht wird es dann klarer:
Man kommt für ein Windowsprogramm mit purem C Code aus und braucht nichts über OOP zu wissen.
-
ja, man kann immer viel machen ohne viel zu wissen.
Aber für einen Windowmanager (oder, so wie ichs verstanden habe, GUI-Library) sollte man definitiv mal von OOP gehört haben.
-
Hallo,
vielen Dank für Eure Diskussion. Ich danke vor allem Big Brother für seine direkt hilfreichste und nette Antwort.
Da sowas mit einfachen statischen Variablen nicht geht, habe ich mir auch schon gedacht, ob ich in meiner "window_t"-Struktur ein "void *data" hinzufüge, damit jedes winproc bei seiner Erstellung durch MSG_CREATE mit malloc() seine eigene Struktur allokiert. Ich war mir jedoch ziemlich unsicher.
Übrigends schreibe ich den gesamten Windowmanager objektbasiert. Dafür schreibe ich die Eigenschaften in eine Struktur, welche ich dann immer als erstes Element an die entsprechenden Funktionen übergebe.
Die window_add() war eigentlich schon das beste Anzeichen dafür.
windows = list_head_init(); window_add(windows, 430, 40, 540, 580, winproc_luaconsole, NULL);
Ich programmiere seit mehreren Jahren OOP in PHP und habe diesbezüglich Erfahrung von OOP (Eigenschaften, Methoden, Vererbung).
list_head_init() ist eine Listenimplementierung. Um einen Zeiger hinzuzufügen, benutzt man list_head_add(list_head, void *).
Dieser C-Code in PHP könnte z.B. so aussehen:
class list_head_c { public $list = array(); public function add($element) { $list[] = $element; } } class windows_c extends list_head_c { public function add_window(...) { $struct = ...; $this->list->add($struct); } } // Ende der Vorgeschichte $windows = new windows_c; $windows->add(430, 40, 540, 580, winproc_luaconsole, NULL);
Sogesehen kann man sogar ziemlich einfach in C vererben.
Als Beispiel mal die window_add():
struct window { int left; int top; int width; int height; list_head_t *message_queue; HANDLE thread_winproc; void (*winproc)(); void *data; HDC hdc; }; typedef struct window window_t; window_t *window_add(list_head_t *windows, int left, int top, int width, int height, void (*winproc)(), void *data) { window_t *window; window = malloc(sizeof(window_t)); window->left = left; window->top = top; window->width = width; window->height = height; window->message_queue = list_head_init(); window->hdc = NULL; window->thread_winproc = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)winproc_win1, window, 0, 0); window->winproc = winproc; window->data = data; send_message(window, MSG_CREATE, 0, 0); send_message(window, MSG_PAINT, 0, 0); list_head_add(windows, window); return window; }
Die Behauptung, dass man für einen Windowmanager OOP können sollte, kann ich nur zustimmen.
Ich hoffe, dass einige mit diesen C-Konstrukten etwas anfangen können und dass sie für ein wenig mehr Klarheit sorgen.
Weitere hilfreiche Worte könnt ihr hier nachlesen (ab 3.2.3. Objektbasierte Programmierung im Kernel): https://ezs.kr.hsnr.de//TreiberBuch/html/sec.technik.html
Dort hat glaub ich auch OO in C bei mir angefangen.
-
DrGreenthumb schrieb:
MessageBox nimmt als ersten Parameter ein HWND als Parent. Das ist ein Objekt.
Jedes Hello-World schreibt auf STDOUT. Das ist auch ein Objekt.HWND, STDOUT, von den Dingern lassen sich keine Instanzen anlegen, mit denen man Methoden ausführen kann. Die Dinger kapseln nicht Methoden, Variablen etc.
Die Dinger verhalten sich nicht so, wie man es sich von einem Objekt in OOP vorstellt.
Ich stelle mir unter einem typedef unsigned long HWND;
auch nicht gerade ein Objekt vor. HWND ist die Abkürzung für windowhandle, es ist eine Zugriffsnummer. Ähnlich verhält es sich mit STDOUT.MfG,
object0r.
-
object0r schrieb:
HWND, STDOUT, von den Dingern lassen sich keine Instanzen anlegen, mit denen man Methoden ausführen kann. Die Dinger kapseln nicht Methoden, Variablen etc.
Die Dinger verhalten sich nicht so, wie man es sich von einem Objekt in OOP vorstellt.
Ich stelle mir unter einem typedef unsigned long HWND;
auch nicht gerade ein Objekt vor. HWND ist die Abkürzung für windowhandle, es ist eine Zugriffsnummer. Ähnlich verhält es sich mit STDOUT.du kannst mehrere HWNDs und FILE* (für stdin) gleichzeitig haben. egal ob zugriffsnummer oder struct-pointer, das sind objekte. OOP ist ein primär ein konzept und nicht sprachabhängig. lest euch noch mal alle beiträge von DrGreenthumb in diesem thread durch, dann versteht ihr's vielleicht.
-
;fricky schrieb:
das sind objekte.
steht wo??
-
object0r schrieb:
;fricky schrieb:
das sind objekte.
steht wo??
hier: "anything that may be presented to the mind: objects of thought."
http://plato.stanford.edu/entries/object/
-
;fricky schrieb:
object0r schrieb:
;fricky schrieb:
das sind objekte.
steht wo??
hier: "anything that may be presented to the mind: objects of thought."
http://plato.stanford.edu/entries/object/
Ja, aber sowas wird nicht hier in Deutschland gelehrt, z.B. an der Uni oder?
-
object0r schrieb:
Ja, aber sowas wird nicht hier in Deutschland gelehrt, z.B. an der Uni oder?
klar doch. russell, wittgenstein usw. werden auch hier als grosse denker verehrt.