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:
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?
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
classFoo{public:staticvoid someFunction(params..);// other stuff}
No seu arquivo de implementação, diga foo.cpp
#include"foo.h"voidFoo::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.
@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:
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 ...
static
palavra - chave. Escreva astatic
palavra-chave apenas na definição de classe no arquivo de cabeçalhoRespostas:
Isto é.
test.hpp:
test.cpp:
Eles nem sempre estão alinhados, não, mas o compilador pode fazê-los.
fonte
Tente o seguinte:
header.hxx:
class.cxx:
fonte
helper.hxx
helper.cxx
A.cxx
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?
fonte
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?
fonte
inline
outemplate
ou você vai ter vários erros de definição do vinculador.No seu arquivo de cabeçalho, diga foo.h
No seu arquivo de implementação, diga foo.cpp
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
fonte
@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:
fonte
Certamente você pode. Eu diria que você deveria.
Este artigo pode ser útil:
http://www.learncpp.com/cpp-tutorial/812-static-member-functions/
fonte
A
#include
diretiva 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 ...
fonte