Globaler Variablen-Container
-
Beispiel wäre die Instanz des main-windows (Qt), die andere Klassen brauchen, wenn sie z.b. ein Fenster in dem mainwindow (MDI) öffnen wollen usw.
Das Gleiche mit der Klasse song: Zugriff darauf braucht fast jede andere Klasse, weil song grundlegende Informationen beinhaltet (wie z.b. Patter-names, BPM, ...) Pattern-names braucht der der pattern-manager, in die Klasse pattern-manager will ich den pattern-names-vector aber nicht reinstecken, weil der song ja auch drauf zugreift, nämlich wenn er "sich" in eine Datei speichert... Außerdem hat song nützliche routinen, wie get_channel, get_num_of_patterns usw. die andere Klassen auch brauchen... Ist alles ein ziemlich komplexes Gebilde, das insgesamt unsauber genug istDeswegen will ich da ja ein bisschen Ordnung reinbringen, in dem ich die Pointer irgendwo zusammenfasse...
-
Ob "Song" ein Singelton werden sollte weiß ich nicht. Vielleicht kann man ja mehrere Songs gleichzeitig offen haben?
Pattern-names braucht der der pattern-manager, in die Klasse pattern-manager will ich den pattern-names-vector aber nicht reinstecken, weil der song ja auch drauf zugreift, nämlich wenn er "sich" in eine Datei speichert...
Ich muss mir den Code dazu mal ansehen. Nur nach der Beschreibung könnte der Song ja auch den Pattern-Manager fragen: "Gib mir bitte mal eine Liste mit den Namen der Pattern", wenn er sich speichern will.
-
Also erst einmal: ich hab das jetzt mit den Singletons gemacht, ist wirklich was feines, auch wenn ich noch die die optimale Lösung habe, d.h. ich habe momentan für alle Klassen, die von sich selbst nur eine instanz erzeugen können sollen, das Singleton-Muster einzeln implementiert, besser wäre hier natürlich eine Basisklasse für Singletons, hier habe ich aber das Problem, dass ich die abgeleiteten Klassen nicht zwingen kann, ctor und dtor private oder protected zu halten... Entsprechende Lösungen wären viel zu komplex und für den Anwendungsbereich völlig unangemessen... Außerdem ist das Singleton-Muster ja nicht weiter schwer zu implementieren, einfach dtor und ctor in die private-section stecken, statischen pointer auf sich selbst in der private-section hinzufügen und eine einfache inline funktion zum abfragen der instanz in die public-section...
Helium schrieb:
Ob "Song" ein Singelton werden sollte weiß ich nicht. Vielleicht kann man ja mehrere Songs gleichzeitig offen haben?
das is nich vorgesehen, wenn man das will, muss man mein Programm einfach noch mal starten... Da ich Clipboard-Funktionen von Qt benutzen will, ist der Inhalt des Clipboards global sichtbar, d.h. man kann danmn z.B. auch in einem Song ein Pattern kopieren und in der anderen Instanz von meinem Programm einfügen... Wozu dann extra Arbeit mit mehreren Songs offen haben... Habs aber trotzdem als Singleton gemacht, weil auch sonst der Song überall gebraucht wird...
Helium schrieb:
Pattern-names braucht der der pattern-manager, in die Klasse pattern-manager will ich den pattern-names-vector aber nicht reinstecken, weil der song ja auch drauf zugreift, nämlich wenn er "sich" in eine Datei speichert...
Ich muss mir den Code dazu mal ansehen. Nur nach der Beschreibung könnte der Song ja auch den Pattern-Manager fragen: "Gib mir bitte mal eine Liste mit den Namen der Pattern", wenn er sich speichern will.
Könnte man sicher machen, da aber der Song aber auch generelle Methoden wie add_pattern usw. hat, bei denen er u.a. auf die Liste der Pattern-Names (schreibend) zugreifen muss, ist es denke ich insgesamt angebrachter, all diese Informationen in der Klasse song zu belassen... (auch wenn man entsprechende methoden im patternmanager realisieren könnte, die referenzen auf die entsprechenden listen usw. zurückliefern)
-
todo schrieb:
besser wäre hier natürlich eine Basisklasse für Singletons
Nein. Templates sind die bessere Loesung.
-
singleton vererben funktioniert nicht.
du musst wenn dann einem singleton deine Klasse vererben oder innerhalb eines singletons ein template objekt erstellen, inklusive einer funktion, die auf dieses objekt zugreift.
-
singleton vererben funktioniert nicht.
Wenn du es darauf auslegst schon:
class Singleton { protected: Singleton () {} Singleton (Singeton const & other); public: static Singleton & instance () { static Singleton foo; return foo; } }; class AbgleitetesSingleton : public Singleton { AbgleitetesSingleton () {} AbgleitetesSingleton (AbgleitetesSingleton const & other); public: static AbgleitetesSingleton & instance () { static AbgleitetesSingleton foo; return foo; } };
du musst wenn dann einem singleton deine Klasse vererben
Man vererbt Klassen nicht, sondern Klasen erben einfach von anderen Klasse. Was sie genau erben ist dabei erstmal egal.
oder innerhalb eines singletons ein template objekt erstellen, inklusive einer funktion, die auf dieses objekt zugreift.
template <typename T> struct Foo { T foo; }; class Singleton { Singleton () {} Singleton (Singeton const & other); Foo<int> foo; public: static Singleton & instance () { static Singleton foo; return foo; } void eine_funktion_die_auf_die_Instanz_zugreift () { foo.foo = 42; } };
Und was passiert jetzt?
-
du machst das absichtlich
, najo so lern ich wenigstens die fachsprache
template<class T> class Singleton { Singleton () {} Singleton (Singeton const & other); T bla; public: static Singleton& instance () { static Singleton foo; return foo; } T eine_funktion_die_auf_die_Instanz_zugreift () { return bla; } };
-
du machst das absichtlich
ja klar :p
-
class Singleton { protected: Singleton () {} Singleton (Singeton const & other); public: static Singleton & instance () { static Singleton foo; return foo; } };
funktioniert das? hier gabs ma nen ähnlichen versuch den dtor protected zu machen, der versuch scheiterte aber kläglich, da protected dtors der basisklasse vom dtor der abgeleiteten klasse aufgerufen werden konnten..
-
funktioniert das? hier gabs ma nen ähnlichen versuch den dtor protected zu machen, der versuch scheiterte aber kläglich, da protected dtors der basisklasse vom dtor der abgeleiteten klasse aufgerufen werden konnten..
Das ist bei Konstruktoren nicht anderes, aber wenn du in mein Beispiel guckst, wirst du shenen, dass es in der abgeleiteten Klasse privat ist.