Erzeugen eines global verfügbaren Objekts innerhalb einer Funktion
-
Hallo werte User,
ich bin neu hier und habe ein kleines Problem, für welches ich leider noch keine Lösung erkennen kann. Vielleicht kann mir hier jemand helfen.

Ausganspunkt: ich arbeite an einem C++-Projekt, welches grundlegende Funktionalitäten unterschiedlicher Sprachsoftware (z.B. Microsoft SAPI, etc.) in einer MFC-Anwendung implementiert. Zugrunde liegen die Dialog-Klasse (das Anwendungsfenster), sowie Klassen für die jeweiligen Spracherkenner/Sprachsynthesizer (im Nachhinein "E/S" genannt).
Problem: um Ressourcen zu sparen, will ich vermeiden, Objekte aller E/S-Klassen global beim Programstart anzulegen, da zur Laufzeit zu einem Zeitpunkt immer nur ein E/S-Objekt genutzt wird. Die verschiedenen E/S-Objekte müssen allerdings während der Laufzeit dynamisch gegeneinaner austauschbar sein. Dazu Ich will nun während der Laufzeit des Programms dynamisch (via Button-Klick, also in einer Funktion) ein neues Objekt einer E/S-Klasse dynmisch erzeugen und das vorherige Objekt zerstören. Die Objekte müssen nach Ihrer Instanzierung innerhalb einer Memberfunktion des Dialogs allerdings global auch für andere Funktionen des Dialogs verfügbar sein. Und genau DAS bekomme ich ich nicht hin. Als kleine Veranschaulichung:
class KlasseA { [...] }; class KlasseB { [...] }; class Dialog { [...] void OnBnClickedBtn1() { // existentes ObjektA (von KlasseA) zerstören // ObjektB (von KlasseB) instanzieren } void OnBnClickedBtn2() { // auf Funktionen von ObjektB zugreifen } };Wenn ich ein Objekt erstelle, ist es immer nur lokal in der übergeordneten Funktion existent. Mag sein, dass es eine einfache Lösung dafür gibt, aber ich stehe komplett auf dem Schlauch. Für jeden hilfreichen Hinweis bin ich unendlich dankbar!

-
Je nachdem wo das Objekt überall sichtbar sein muss, musst du es deklarieren.
class InterfaceOfES { // [...] }; class KlasseA : public InterfaceOfES { // [...] }; class KlasseB : public InterfaceOfES { // [...] }; class Dialog { // nur in Dialog nötig InterfaceOfES* theESInterface [...] void OnBnClickedBtn1() { // wenn theESInterface auf Objekt zeigt delete theESInterface // ObjektB (von KlasseB) instanzieren theESInterface = new B(); } void OnBnClickedBtn2() { // auf Funktionen von theESInterface zugreifen } };Wenn es wirklich global nötig ist, dann entweder (bevorzugt) über Übergabeparameter arbeiten, oder das Objekt global, sprich außerhalb der Klasse deklarieren (meistens schlechter Stil)
-
Hmm... das schaut aus, als könnte es wirklich so gehen. Ich probier es mal aus und melde mich dann mit dem Ergebnis. Vielen Dank schonmal für die schnelle Antwort!
