Como implementar funções de membro de classe estática no arquivo * .cpp?

125

É possível implementar staticfunções de membro de classe no arquivo * .cpp em vez de fazê-lo no arquivo de cabeçalho?

Todas as staticfunções são sempre inline?

BartoszKP
fonte
4
Você poderia explicar por que "NÃO PODE" implementar a função memeber de classe estática no seu arquivo cpp? algum erro? Geralmente, não há limitação sobre onde você implementa essa função.
winterTTr
7
@winterTTr, A questão provavelmente surgiu porque a maioria dos exemplos / tutoriais na Web não apresenta um exemplo de implementação separado, mas a declara e define no cabeçalho. Pelo menos os seis primeiros hits no meu mecanismo de pesquisa favorito para "Função membro estática C ++" fazem tudo dessa maneira e não explicam como você o implementa em arquivos separados para um iniciante.
precisa saber é
7
Ao implementar, não repita a staticpalavra - chave. Escreva a staticpalavra-chave apenas na definição de classe no arquivo de cabeçalho
SomethingSomething
@crobar, você está certo de que há uma escassez de exemplos de vários arquivos. Eu me esforcei para descobrir isso, então decidi compartilhar o seguinte:
Don Mclachlan

Respostas:

153

Isto é.

test.hpp:

class A {
public:
    static int a(int i);
};

test.cpp:

#include <iostream>
#include "test.hpp"


int A::a(int i) {
    return i + 2;
}

using namespace std;
int main() {
    cout << A::a(4) << endl;
}

Eles nem sempre estão alinhados, não, mas o compilador pode fazê-los.

CromTheDestroyer
fonte
47

Tente o seguinte:

header.hxx:

class CFoo
{
public: 
    static bool IsThisThingOn();
};

class.cxx:

#include "header.hxx"
bool CFoo::IsThisThingOn() // note: no static keyword here
{
    return true;
}
paulcam
fonte
9

helper.hxx

class helper
{
 public: 
   static void fn1 () 
   { /* defined in header itself */ }

   /* fn2 defined in src file helper.cxx */
   static void fn2(); 
};

helper.cxx

#include "helper.hxx"
void helper::fn2()
{
  /* fn2 defined in helper.cxx */
  /* do something */
}

A.cxx

#include "helper.hxx"
A::foo() {
  helper::fn1(); 
  helper::fn2();
}

Para saber mais sobre como o c ++ lida com funções estáticas, visite: As funções de membro estáticas no c ++ são copiadas em várias unidades de conversão?

Rizz Rocks
fonte
2

Sim, você pode definir funções membro estáticas no arquivo * .cpp. Se você o definir no cabeçalho, o compilador o tratará como embutido. No entanto, isso não significa que cópias separadas da função de membro estático existam no executável. Siga este post para saber mais sobre isso: As funções de membro estático em c ++ são copiadas em várias unidades de tradução?

cppcoder
fonte
Se você o definir no corpo da classe, ele será automaticamente o padrão. Se é no cabeçalho fora do corpo da classe, é melhor que seja marcado quer inlineou templateou você vai ter vários erros de definição do vinculador.
Ben Voigt
2

No seu arquivo de cabeçalho, diga foo.h

class Foo{
    public:
        static void someFunction(params..);
    // other stuff
}

No seu arquivo de implementação, diga foo.cpp

#include "foo.h"

void Foo::someFunction(params..){
    // Implementation of someFunction
}

Muito importante

Apenas certifique-se de não usar a palavra-chave estática na assinatura do método ao implementar a função estática no seu arquivo de implementação.

Boa sorte

Mr. Suryaa Jha
fonte
1

@crobar, você está certo de que há uma escassez de exemplos de vários arquivos, então decidi compartilhar o seguinte na esperança de que ajude outras pessoas:

::::::::::::::
main.cpp
::::::::::::::

#include <iostream>

#include "UseSomething.h"
#include "Something.h"

int main()
{
    UseSomething y;
    std::cout << y.getValue() << '\n';
}

::::::::::::::
Something.h
::::::::::::::

#ifndef SOMETHING_H_
#define SOMETHING_H_

class Something
{
private:
    static int s_value;
public:
    static int getValue() { return s_value; } // static member function
};
#endif

::::::::::::::
Something.cpp
::::::::::::::

#include "Something.h"

int Something::s_value = 1; // initializer

::::::::::::::
UseSomething.h
::::::::::::::

#ifndef USESOMETHING_H_
#define USESOMETHING_H_

class UseSomething
{
public:
    int getValue();
};

#endif

::::::::::::::
UseSomething.cpp
::::::::::::::

#include "UseSomething.h"
#include "Something.h"

int UseSomething::getValue()
{
    return(Something::getValue());
}
Don Mclachlan
fonte
0

A #includediretiva significa literalmente "copiar todos os dados nesse arquivo para este local". Portanto, quando você inclui o arquivo de cabeçalho, ele está textualmente dentro do arquivo de código, e tudo nele estará presente, dê ou tire o efeito de outras diretivas ou substituições de macro, quando o arquivo de código (agora chamado de unidade de compilação ou unidade de tradução ) for transferido do módulo pré-processador para o módulo compilador.

O que significa que a declaração e a definição da sua função de membro estática estavam realmente no mesmo arquivo o tempo todo ...

Blair Houghton
fonte