Autor Beitrag
Aya
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: 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:

ausblenden 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:

ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 16.04.09 23:31 
user profile iconAya hat folgendes geschrieben Zum zitierten Posting springen:
zugreifen müßte ich dann auf diese art:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Do 16.04.09 23:43 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconAya hat folgendes geschrieben Zum zitierten Posting springen:
zugreifen müßte ich dann auf diese art:

ausblenden 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..

S ist in dem falle auch static = es wird nur eine instanz erzeugt.

[quote="user profile iconjaenicke"(558531)]
user profile iconAya hat folgendes geschrieben Zum zitierten Posting springen:
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.

Im grude ist das mein static S da oben.. aber ich finde den weg halt recht unschön.. :/

Aya~

_________________
Aya
I aim for my endless dreams and I know they will come true!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 17.04.09 00:07 
user profile iconAya hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 339
Erhaltene Danke: 20

Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
BeitragVerfasst: Fr 17.04.09 08:50 
was spricht gegen nen statischen Konstruktor?
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Fr 17.04.09 10:08 
user profile iconGreenberet hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 339
Erhaltene Danke: 20

Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Fr 17.04.09 22:43 
ausblenden 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:
ausblenden 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