| Autor |
Beitrag |
Aya
      
Beiträge: 1964
Erhaltene Danke: 15
MacOSX 10.6.7
Xcode / C++
|
Verfasst: Do 16.04.09 23:17
Hi,
ich habe ein kleines C++ problem..
Ich habe eine klasse, die eigentlich nur aus static funktionen bestehen soll, in etwa so:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| class CMyClass { private: static COtherClass data; public: static void doSomething(); static void doSomethingElse(); static void doSomethingNew(); }; |
die static funktionen greifen alle aud die static variable "data" zu, was ja auch alles wunderbar klappt etc.
Das problem an der geschichte ist jetzt, data muß initialisiert werden, und zwar mit mehr datan als über den constructor von COtherClass möglich.
Normalerweise würde ich das in den constructor von CMyClass schreiben, aber den gibt es ja bei statics nicht...
Deswegen wäre meine aktuelle alternativ lösung in etwa so:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| class CMyClass { private: COtherClass data; public: CMyClass(); void doSomething(); void doSomethingElse(); void doSomethingNew();
static CMyClass S; };
CMyClass::CMyClass() { doSomethingWithData(); } |
zugreifen müßte ich dann auf diese art:
C#-Quelltext 1:
| CMyClass::S.doSomething(); |
geht zwar, ist aber irgendwie sehr unschön..
gibt es da irgendeine tolle alternative lösung für, ohne das ich beim programm-start einmal eine init-funktion oder so aufrufen muß?
Ich hatte schon so überlegungen angestellt wie den ::-Operator zu überschreiben und da S zurückzugeben, aber das geht leider nicht weil der ::-operator nicht überschreibbar ist
Ideen..?
Aya~
PS: Bei jedem aufruf einer static funktion zu schauen ob data schon initialisiert ist, und wenn nicht es initialisieren fällt auch raus, da die funktionen EXTREM oft aufgerufen werden und das denke ich dann durchaus ein wenig performance kosten würde.
_________________ Aya
I aim for my endless dreams and I know they will come true!
Zuletzt bearbeitet von Aya am Do 16.04.09 23:34, insgesamt 1-mal bearbeitet
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 16.04.09 23:31
Aya hat folgendes geschrieben : | zugreifen müßte ich dann auf diese art:
C#-Quelltext 1:
| CMyClass::S.doSomething(); | |
Damit würdest du doch jedesmal eine neue Instanz erstellen und dann wegwerfen, oder? Das würde aber genau das Gegenteil einer performanten Lösung sein.
Es gibt im Grunde so wie ich das sehe zwei Möglichkeiten, je nach Anwendung. Entweder eine Klasse, die im Konstruktor die Daten bekommt, und die einmalig erstellt wird. Dann müsste danach nur noch jeweils die entsprechende Methode aufgerufen werden.
Oder die Daten werden an die statischen Methoden (ggf. per Pointer) übergeben, aber das wäre nur sinnvoll, wenn diese jeweils geändert würden zwischendurch.
|
|
Aya 
      
Beiträge: 1964
Erhaltene Danke: 15
MacOSX 10.6.7
Xcode / C++
|
Verfasst: Do 16.04.09 23:43
_________________ Aya
I aim for my endless dreams and I know they will come true!
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 17.04.09 00:07
Aya hat folgendes geschrieben : | | Im grude ist das mein static S da oben.. aber ich finde den weg halt recht unschön.. :/ |
Mit static sehe ich das genauso, ohne nicht. Denn ohne statische Methoden ist diese Vorgehensweise doch völlig normal.
|
|
Greenberet
      
Beiträge: 339
Erhaltene Danke: 20
Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
|
Verfasst: Fr 17.04.09 08:50
was spricht gegen nen statischen Konstruktor?
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| class CMyClass { private: static COtherClass data; public: static CMyClass(); static void doSomething(); static void doSomethingElse(); static void doSomethingNew(); };
static CMyClass::CMyClass() { doSomethingWithData(); } |
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 17.04.09 09:22
Naja, aber das ist doch irgendwie...
Wozu static, wenn dann doch was in der Klasse gemacht werden soll? Static ist doch gerade dafür, wenn etwas ohne Daten aus einer speziellen Instanz auskommt. Das kann man so zwar dann umgehen, aber das ist doch nicht gerade Sinn und Zweck von statischen Feldern und Methoden...
|
|
Aya 
      
Beiträge: 1964
Erhaltene Danke: 15
MacOSX 10.6.7
Xcode / C++
|
Verfasst: Fr 17.04.09 10:08
Greenberet hat folgendes geschrieben : | | was spricht gegen nen statischen Konstruktor? |
Oh.. ich wusste nicht das man einen constructor auch static machen kann, dachte immer das ginge nicht.
Wenn das geht ist es genau das was ich gesucht habe
| Zitat: | | Wozu static, wenn dann doch was in der Klasse gemacht werden soll? Static ist doch gerade dafür, wenn etwas ohne Daten aus einer speziellen Instanz auskommt. Das kann man so zwar dann umgehen, aber das ist doch nicht gerade Sinn und Zweck von statischen Feldern und Methoden... |
Na ja, das ist eine klasse die sehr grundlegende funktionen hat die man einfach ständig überall braucht (ne art Wrapper).
Jedesmal davon eine instanz zu erstellen ist sehr inperformant (wie gesagt, wird sehr oft benutzt).. also einfach alles static machen.
Ist im grunde das gleiche wie eine globale static variable von der klasse, aber ich mag globale variablen nicht
Aya~
_________________ Aya
I aim for my endless dreams and I know they will come true!
|
|
Aya 
      
Beiträge: 1964
Erhaltene Danke: 15
MacOSX 10.6.7
Xcode / C++
|
Verfasst: Fr 17.04.09 12:30
Zu früh gefreut.. ich wusste es doch :/
| Compiler hat folgendes geschrieben: | | error: constructor cannot be static member function |
_________________ Aya
I aim for my endless dreams and I know they will come true!
|
|
Greenberet
      
Beiträge: 339
Erhaltene Danke: 20
Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
|
Verfasst: Fr 17.04.09 16:15
gut ich hab echt gedacht, dass das geht...
egal, dann arbeite halt mim Singelton design pattern als workaround. ( Google hilft da schnell weiter )
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 17.04.09 17:09
Das hat zwar einige Vorteile, ist aber wieder deutlich langsamer, wenn man das öfter braucht.
Ich würde z.B. ein Feld mit einer Instanz der Klasse in der Hauptklasse deklarieren und den Pointer als Parameter weiterreichen.
|
|
tommie-lie
      
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: Fr 17.04.09 22:43
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| class Miep { private: static COtherClass data; static void doSomethingWithData(); public: CMyClass() { CMyClass::doSomethingWithData(); } static void doSomething(); static void doSomethingElse(); static void doSomethingNew(); } |
Dann in einer cpp-Datei:
Quelltext 1: 2: 3:
| #include "Miep.h"
static CMyClass _myinstance; |
Die initialization order von statischen Bezeichnern ist nicht definiert, aber es ist sichergestellt, daß sie vor dem Aufruf von int main() vollständig initialisiert sind. Also wird noch bevor anderer eigener Code ausgeführt wird, der Konstruktor con CMyClass ausgeführt, der die statische Initialisierungsfunktion benutzt, um die statischen Daten zu initialisieren.
Allerdings verursacht das Probleme, wenn im Konstruktor von CMyClass auf andere (statische) Objekte zugegriffen wird. Die Initialisierungereihenfolge ist und bleibt undefiniert. Abholfe schafft eine andere Lösung, die aber nicht unbedingt notwendig ist, wenn es bei diesem Einzelfall bleibt.
_________________ Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
|
|
|