none
Função detro e fora de uma classe (DIRERENÇA). RRS feed

  • Pergunta

  • Gente, em java toda função (método) deve obrigatóriamente ser definido dentro de uma classe.

    Em c++ essa regra não é obrigatória, então gostaria de saber qual a diferença se eu definir uma função dentro de uma classe e definir fora.


    Automação Comercial com Visual C++.NET e MFC!!!!! Masoquismo?
    quinta-feira, 17 de junho de 2010 15:02

Respostas

  • No caso de C++, definir e implementar dentro da classe é um "hint" para o compilador torná-la inline quando o mesmo efetuar otimização.

    Outro ponto, normalmente qdo se distribui uma .lib ou uma .dll escrita em C++ de código fechado, vc passa o binário, mais o header (.h ou .hpp) para o consumidor saber o que chamar nela (vide o Platform SDK windows.h). Neste caso você terá um arquivo de definição (.h ou .hpp) e outro de implementação (.cpp)


    Fabio Galuppo
    • Marcado como Resposta matheusssilva terça-feira, 22 de junho de 2010 21:56
    • Não Marcado como Resposta matheusssilva terça-feira, 22 de junho de 2010 21:57
    • Marcado como Resposta matheusssilva quarta-feira, 23 de junho de 2010 21:43
    segunda-feira, 21 de junho de 2010 13:54
  • Na hora de consumir, teoricamente é indiferente.

    Mas se vc compilar uma LIB por exemplo, vai ter que passar o .h para ser usada no código consumidor e a .lib para ser linkada.

    Se vc fizer tudo no .h, você só passa o .h - junto com o código fonte aberto - assim como ocorre com a STL. Se vc procurá-la dentro do diretório do VC, vai ver seu código fonte aberto.


    Fabio Galuppo
    • Marcado como Resposta matheusssilva terça-feira, 22 de junho de 2010 21:56
    • Não Marcado como Resposta matheusssilva terça-feira, 22 de junho de 2010 21:57
    • Marcado como Resposta matheusssilva quarta-feira, 23 de junho de 2010 21:43
    terça-feira, 22 de junho de 2010 13:53
  • Nas duas. Sempre deve passar o .h para o consumidor da biblioteca.

    Pode haver um caso assim tudo no mesmo .h:

    struct X

    {

      void Func();

    };

    void X::Func()

    {

    ...
    }

    Ainda que quebrando a declaração e a implementação, mas mantendo no mesmo .h, vc continua passando o source code para o consumidor.

    Como regra geral, eu normalmente declaro e implemento na classe quanto vou distribuir o .h e o source code juntos - tipo STL.

    struct X

    {

    void Func()

    {

    ...
    }

    };

    senão, quando não vou passar source code, eu quebro em - usando os wizards do VC com MFC ela faz deste jeito tbm:

    .h

    struct X

    {

      void Func();

    };

    .cpp

    #include "X.h"

    void X::Func()

    {

    ...
    }


    Fabio Galuppo
    • Sugerido como Resposta Fabio Galuppo terça-feira, 22 de junho de 2010 16:59
    • Marcado como Resposta matheusssilva terça-feira, 22 de junho de 2010 21:56
    • Não Marcado como Resposta matheusssilva terça-feira, 22 de junho de 2010 21:57
    • Marcado como Resposta matheusssilva quarta-feira, 23 de junho de 2010 21:43
    terça-feira, 22 de junho de 2010 16:57
  • Boa pergunta,

    O compilador e o linker do VC podem fazer otimizações inline para managed code tbm. Mas no .NET, não se passa o .h para o consumidor, pq a própria .dll tem os metadados daquele assembly - além de .NET ser independente de linguagem (o mesmo caso ocorre com COM - mas esta é uma outra estória). Inclusive o processo de consumo é diferente. Vc adiciona a DLL como referencia num aplicativo .NET e ela está pronta para ser usada.

    No caso da separação entre .h (ou .hpp) e .cpp, é indiferente - se me lembro bem, todo código (declaração e implementação) gerado pela IDE com Windows Forms no C++/CLI fica somente no .h.


    Fabio Galuppo
    • Marcado como Resposta matheusssilva quarta-feira, 23 de junho de 2010 21:43
    quarta-feira, 23 de junho de 2010 13:51

Todas as Respostas

  • Que difícil em, investir em C++ hoje é uma "missão quase impossivel" é o verdadeiro "caminho das pedras", não se encontra conteúdo e os poucos foruns que existem estão dando "teia de aranha".
    Automação Comercial com Visual C++.NET e MFC!!!!! Masoquismo?
    domingo, 20 de junho de 2010 12:17
  • No caso de C++, definir e implementar dentro da classe é um "hint" para o compilador torná-la inline quando o mesmo efetuar otimização.

    Outro ponto, normalmente qdo se distribui uma .lib ou uma .dll escrita em C++ de código fechado, vc passa o binário, mais o header (.h ou .hpp) para o consumidor saber o que chamar nela (vide o Platform SDK windows.h). Neste caso você terá um arquivo de definição (.h ou .hpp) e outro de implementação (.cpp)


    Fabio Galuppo
    • Marcado como Resposta matheusssilva terça-feira, 22 de junho de 2010 21:56
    • Não Marcado como Resposta matheusssilva terça-feira, 22 de junho de 2010 21:57
    • Marcado como Resposta matheusssilva quarta-feira, 23 de junho de 2010 21:43
    segunda-feira, 21 de junho de 2010 13:54
  • Ainda mais qdo tem jogo do Brasil na TV :-) :-) ;-)
    Fabio Galuppo
    segunda-feira, 21 de junho de 2010 13:56
  • Mas o que muda na hora de usar a função? Nada? Dentro ou fora tem as mesmas caracteristicas para quem vai chama-la?

     

    Grato galuppo.


    Automação Comercial com Visual C++.NET e MFC!!!!! Masoquismo?
    terça-feira, 22 de junho de 2010 12:46
  • Na hora de consumir, teoricamente é indiferente.

    Mas se vc compilar uma LIB por exemplo, vai ter que passar o .h para ser usada no código consumidor e a .lib para ser linkada.

    Se vc fizer tudo no .h, você só passa o .h - junto com o código fonte aberto - assim como ocorre com a STL. Se vc procurá-la dentro do diretório do VC, vai ver seu código fonte aberto.


    Fabio Galuppo
    • Marcado como Resposta matheusssilva terça-feira, 22 de junho de 2010 21:56
    • Não Marcado como Resposta matheusssilva terça-feira, 22 de junho de 2010 21:57
    • Marcado como Resposta matheusssilva quarta-feira, 23 de junho de 2010 21:43
    terça-feira, 22 de junho de 2010 13:53
  • Na hora de consumir, teoricamente é indiferente.

    Mas se vc compilar uma LIB por exemplo, vai ter que passar o .h para ser usada no código consumidor e a .lib para ser linkada.

    Essa regra se aplica em qualquer das duas situações? dentro ou fora?
    terça-feira, 22 de junho de 2010 15:17
  • Nas duas. Sempre deve passar o .h para o consumidor da biblioteca.

    Pode haver um caso assim tudo no mesmo .h:

    struct X

    {

      void Func();

    };

    void X::Func()

    {

    ...
    }

    Ainda que quebrando a declaração e a implementação, mas mantendo no mesmo .h, vc continua passando o source code para o consumidor.

    Como regra geral, eu normalmente declaro e implemento na classe quanto vou distribuir o .h e o source code juntos - tipo STL.

    struct X

    {

    void Func()

    {

    ...
    }

    };

    senão, quando não vou passar source code, eu quebro em - usando os wizards do VC com MFC ela faz deste jeito tbm:

    .h

    struct X

    {

      void Func();

    };

    .cpp

    #include "X.h"

    void X::Func()

    {

    ...
    }


    Fabio Galuppo
    • Sugerido como Resposta Fabio Galuppo terça-feira, 22 de junho de 2010 16:59
    • Marcado como Resposta matheusssilva terça-feira, 22 de junho de 2010 21:56
    • Não Marcado como Resposta matheusssilva terça-feira, 22 de junho de 2010 21:57
    • Marcado como Resposta matheusssilva quarta-feira, 23 de junho de 2010 21:43
    terça-feira, 22 de junho de 2010 16:57
  • E pra managed c++ a regra é a mesma? Dentro e fora nada muda para o cosumidor?
    Automação Comercial com Visual C++.NET e MFC!!!!! Masoquismo?
    terça-feira, 22 de junho de 2010 21:59
  • Boa pergunta,

    O compilador e o linker do VC podem fazer otimizações inline para managed code tbm. Mas no .NET, não se passa o .h para o consumidor, pq a própria .dll tem os metadados daquele assembly - além de .NET ser independente de linguagem (o mesmo caso ocorre com COM - mas esta é uma outra estória). Inclusive o processo de consumo é diferente. Vc adiciona a DLL como referencia num aplicativo .NET e ela está pronta para ser usada.

    No caso da separação entre .h (ou .hpp) e .cpp, é indiferente - se me lembro bem, todo código (declaração e implementação) gerado pela IDE com Windows Forms no C++/CLI fica somente no .h.


    Fabio Galuppo
    • Marcado como Resposta matheusssilva quarta-feira, 23 de junho de 2010 21:43
    quarta-feira, 23 de junho de 2010 13:51