Frage

Code

 static void MyClass::ThreadEntryStatic()
 {
    //...
 }

 void MyClass::Begin()
 {
         CreateThread(..,ThreadEntryStatic,..);
 }

In welchem Zustand sollten wir die statische Klasse ?

War es hilfreich?

Lösung

Es gibt drei Orte, die das Schlüsselwort static verwendet werden kann.Man wird bei der Deklaration einer Struktur/Klasse, wenn diesem Kontext bedeutet, dass die Methode ist eine Klassenmethode, anstatt eine Instanz-Methode.Dies bedeutet, dass diese Methode direkt aufgerufen wird, und Sie brauchen nicht eine Instanz.Aus dieser statischen Methode können Sie nicht Zugriff auf Instanz-Variablen.

In MyClass.h

struct MyClass
{
  static void ThreadEntryStatic();

  void Begin();
};

In MyClass.cpp

void MyClass::ThreadEntryStatic()
{
}

void MyClass::Begin()
{
  CreateThread(.., MyClass::ThreadEntryStatic, ...);
}

Ein zweiter Fall, wo das static-Schlüsselwort zu verwenden ist, ist im Bereich einer Datei, in denen Sie nicht möchten, dass die Sichtbarkeit der variable deklariert werden sichtbar außerhalb der Datei.Sie können auch einen anonymen namespace für diese als gut.

Einen Dritten Fall, wo das Schlüsselwort static verwendet wird, ist im Anwendungsbereich der Methode und den Wert beibehalten wird, die zwischen den Ausführungen der Funktion (und initialisiert, mit der Vergabe der ersten Zeit).

Andere Tipps

Wenn Sie mit statischen Methoden auf mehrere threads, die Sie brauchen, um zahlen sehr schließen Aufmerksamkeit zu der Synchronisierung von code.Meiner Meinung nach, wenn Sie Multithread-Programmierung, ich versuche, verwenden Sie eine separate Instanz des Objekts oder Arbeit Stück pro thread, und vermeiden Sie jede Art von statischen oder auf freigegebene Daten auf allen.Natürlich ist dies nicht immer möglich ist, so einfädeln, bleibt eines der schwierigsten Programmierung Bereiche zu behandeln.

Als ein konkretes Beispiel

class Test{
      static void foo();      
};

static void Test::foo(){
    // code here
}

ist nicht zu kompilieren, werden Sie nicht in der Lage zu erklären, eine Funktion, die mit static-Schlüsselwort, außerhalb der Klassendeklaration.Sie haben einfach zu entfernen, Schlüsselwort static, wenn Sie die Implementierung der Funktion.

class Test{
      static void foo();      
};

void Test::foo(){
    // code here
}

Ein paar Menschen berührt haben, aber static verwendet für die interne Verlinkung sollte nicht verwendet werden, stattdessen sollte man eine anonyme Namensraum:

namespace
{

void myInternallyLinkedFunction()
{
    // do something
}

int myInternallyLinkedInteger;

class myInternallyLinkedClass
{
public:
    void doSomething();
};

} // anon namespace


void myExternallyLinkedFunction()
{

    ++myInternallyLinkedInteger;
    myInternallyLinkedFunction();
    myInternallyLinkedClass x;
    x.doSomething();
}

Der Wert der statischen Variablen beibehalten werden zwischen Funktionsaufrufen.Check diese MSDN-Eintrag Beispiele.Definieren und verwenden von "statischen" Methoden bereits in chrish Antwort

Statische genutzt werden könnte, bei der Implementierung von singleton-Klassen, wo Sie brauchen, um nur eine Instanz der Klasse.Es Verwendung hängt vom Kontext ab.

Was Ihr Beispiel zeigt, ist eine "statische member-Funktion thread callback" - Muster.Wie der thread-Funktion muss eine WINAPI-Signatur, es ist nicht von einem normalen member-Funktion, die nur ein statisches Element.Oft passieren Sie diese wie ein Roter Faden parametr zu diesem Rückruf, und dann rufen Sie ein echtes Mitglied der Ausführung der thread arbeiten.

Es ist nur eine Nutzung von ein statisches Element, und es gibt viele verschiedene.Es ist wirklich schwer zu erraten, was der Zweck deiner Frage ist.Sind Sie der Lösung einige Besondere problem, oder sind Sie einfach nur interessiert über alle möglichen Verwendungen von statischen Mitglieder oder statische member-Funktionen?

Vollständigeres Beispiel "statische member-Funktion thread callback":

class MyClass
{

  /// background rendering thread
  int ThreadEntry()
  {
     // do the work here
  }

  /// static member callback "proxy"
  static DWORD WINAPI ThreadEntryStatic(void *param)
  {
    return ((EngineDD9 *)param)->ThreadEntry();
  }

  void SpawnThread()
  {
    CreateThread(.., ThreadEntryStatic, ...);
  }

};
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top