Pergunta

Código

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

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

Em que condições devemos usar a estática na classe?

Foi útil?

Solução

Há três lugares que a palavra-chave estática podem ser usadas. Uma é na declaração de um struct / classe quando os meios de contexto que o método é um método de classe em vez de um método de instância. Isto significa que este método é chamado diretamente e você não precisa de uma instância. A partir deste método estático, você não pode variáveis ??de instância de acesso.

Em MyClass.h

struct MyClass
{
  static void ThreadEntryStatic();

  void Begin();
};

Em MyClass.cpp

void MyClass::ThreadEntryStatic()
{
}

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

Um segundo caso em que a palavra-chave estática é uso está no escopo de um arquivo onde você não quer que a visibilidade da variável declarado ser visível fora do arquivo. Você também pode usar um namespace anônimo para isso também.

Um terceiro caso em que a palavra-chave é estático é usado no âmbito de um método e o valor é retido entre as execuções da função (e inicializado com a atribuição da primeira hora).

Outras dicas

Se você estiver executando métodos estáticos em vários tópicos que você precisa para ser prestando muita atenção para sincronizar seu código. Na minha opinião, quando se faz a programação de vários segmentos, eu tento usar uma instância separada do meu objeto ou item de trabalho por thread, e evitar qualquer tipo de estática ou dados compartilhados em tudo. É claro que isso nem sempre é possível, então enfiar continua sendo uma das mais difíceis áreas de programação para lidar com eles.

Como um exemplo concreto,

class Test{
      static void foo();      
};

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

não vai compilar, você não é capaz de declarar uma função com o exterior palavra-chave estática da declaração da classe. Você simplesmente tem que remover palavra-chave estática quando você está implementando a função.

class Test{
      static void foo();      
};

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

Algumas pessoas têm tocado sobre isso, mas static usado para ligação interna não deve ser utilizado, em vez deve-se usar um namespace anônimo:

namespace
{

void myInternallyLinkedFunction()
{
    // do something
}

int myInternallyLinkedInteger;

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

} // anon namespace


void myExternallyLinkedFunction()
{

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

O valor de variáveis ??estáticas são mantidos entre chamadas de função. Verifique este entrada MSDN para exemplos. Definindo e usando métodos "estáticas" foi delineado na resposta das ChrisH

estático pode ser usado quando a implementação de classes únicas, onde você precisa ter apenas uma instância da classe. É de uso depende do contexto.

O seu exemplo mostra um padrão "função de membro estático fio de retorno de chamada". Como a função segmento deve ter uma assinatura WINAPI, ele não pode ser uma função membro normal, apenas uma membro estático. Muitas vezes você passar este como um parametr thread para esse retorno de chamada e, em seguida, chamar um verdadeiro membro realizando o trabalho fio.

Não é apenas um uso de um membro estático, e há muitos diferentes. É realmente difícil de adivinhar qual é o propósito da sua pergunta é. Você está resolvendo algum problema particular, ou você está apenas interessado sobre todos os usos possíveis de membros estáticos ou funções de membro estático?

exemplo mais completo de "função membro callback fio estático":

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, ...);
  }

};
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top