PixelShader
Erfahrenes Mitglied
Hallo Profis
Ich versuche jetzt seit einiger Zeit dem RAII Konzept zu folgen und bin jetzt auf Sockets gestoßen. Bisher, wenn man z.b. eine Datei öffnet, kann in der Klasse die Methode fopen o.ä. uneingeschränkt aufgerufen werden. Wenn ich aber einen Socket erstellen will, darf man WSASocket nicht vor WSAStartup aufrufen.
Dafür erstellte ich einfach zwei Klassen, "WinSock" und "Socket", die gemäß RAII jeweis für WSAStartup und für WSASocket zuständig sind. Wenn nun jeweils eine Instanz der beiden Klassen als globale Variable existieren... oder als lokale in einer "Application" Klasse (unterschied?) kommt das Problem:
- Wie versichere ich dass der Konstructor von WinSock aufjedenfall vor dem von Socket aufgerufen wird? bzw. Dass WinSock generell vor allen Socket's erstellt wird.
Eine andere Frage: Ich habe mir überlegt, da das RAII Idiom festlegt dass wenn ein Objekt existiert, es auch "benutzbar" ist, das nicht auf einen nicht-verbundenen-Socket zutrifft. Folglich machte ich noch eine klasse, die "SocketConnection", wo das Objekt existiert, solange man die Verbindung aufrechterhalten will. Da ich in meiner ... z.B. "Application" Klasse allerdings, zwar immer einen Socket habe, aber natürlich nicht immer eine Connection, ist das Problem:
- Wo erstelle ich eine Instanz von SocketConnection?
-> Wenn ich es in der Application Klasse definiere, müsste immer eine Vebindung bestehen, solange das Programm läuft (irreal)
-> Wenn ich es in einer Funktion definiere, schließt die Verbindung am Ende der Funktion (was ich ja nicht immer haben will) und die SocketConnection Instanz muss immer zu allen weiteren aufgerufenen Funktionen als Parameter übergeben werden, da das dann ja eine lokale Variable ist und nicht von überall zu sehen.
Muss ich also einen Weg finden Objekt-Variablen (wie SocketConnection) verspätet zu ertellen? Und vorzeitig (vor dem destructen des Eltern-Objekts) zu löschen?
Ich habe das Gefühl ich sehe die Sache irgentwie schief. Habe mir 20 Artickel und Tutorials über RAII reingezogen aber solche Fragen sind überall unbeantwortet.
Vielen Dank im vorraus!

Ich versuche jetzt seit einiger Zeit dem RAII Konzept zu folgen und bin jetzt auf Sockets gestoßen. Bisher, wenn man z.b. eine Datei öffnet, kann in der Klasse die Methode fopen o.ä. uneingeschränkt aufgerufen werden. Wenn ich aber einen Socket erstellen will, darf man WSASocket nicht vor WSAStartup aufrufen.
Dafür erstellte ich einfach zwei Klassen, "WinSock" und "Socket", die gemäß RAII jeweis für WSAStartup und für WSASocket zuständig sind. Wenn nun jeweils eine Instanz der beiden Klassen als globale Variable existieren... oder als lokale in einer "Application" Klasse (unterschied?) kommt das Problem:
- Wie versichere ich dass der Konstructor von WinSock aufjedenfall vor dem von Socket aufgerufen wird? bzw. Dass WinSock generell vor allen Socket's erstellt wird.
Eine andere Frage: Ich habe mir überlegt, da das RAII Idiom festlegt dass wenn ein Objekt existiert, es auch "benutzbar" ist, das nicht auf einen nicht-verbundenen-Socket zutrifft. Folglich machte ich noch eine klasse, die "SocketConnection", wo das Objekt existiert, solange man die Verbindung aufrechterhalten will. Da ich in meiner ... z.B. "Application" Klasse allerdings, zwar immer einen Socket habe, aber natürlich nicht immer eine Connection, ist das Problem:
- Wo erstelle ich eine Instanz von SocketConnection?
-> Wenn ich es in der Application Klasse definiere, müsste immer eine Vebindung bestehen, solange das Programm läuft (irreal)
-> Wenn ich es in einer Funktion definiere, schließt die Verbindung am Ende der Funktion (was ich ja nicht immer haben will) und die SocketConnection Instanz muss immer zu allen weiteren aufgerufenen Funktionen als Parameter übergeben werden, da das dann ja eine lokale Variable ist und nicht von überall zu sehen.
Muss ich also einen Weg finden Objekt-Variablen (wie SocketConnection) verspätet zu ertellen? Und vorzeitig (vor dem destructen des Eltern-Objekts) zu löschen?
Ich habe das Gefühl ich sehe die Sache irgentwie schief. Habe mir 20 Artickel und Tutorials über RAII reingezogen aber solche Fragen sind überall unbeantwortet.
Vielen Dank im vorraus!