none
C++/CLI código windows form em header RRS feed

  • Pergunta

  • Bem gente, no livro que estou lendo sobre C++/CLI o autor da um exemplo de windows forms com c++/cli. No exemplo ele coloca todas as declarações referentes ao formulário, declarações, instancias, modificação das propriedades, etc... tudo dentro de um arquivo .h e no arquivo .cpp ele coloca só a função main para executar o formulário. A dúvida é a seguinte, pq colocar tudo em um header? Não pra pra colocar tudo dentro do arquivo cpp? Eu sempre achei que arquivos headers eram usados somente quando vc quer distrubuir uma solução, como uma biblioteca ou uma dll.

    Uma outra dúvida, suponha que em um arquivo .cpp eu queira usar um método que está em outro arquivo .cpp, como fazer essa referencia?

    Tipo, essa mesma situação em java é feita da seguinte maneira:

    //arquivo1 .java
    
    
    public
     class
     MeuNome{
     
     public
     void
     printNome(){
     
      System.out
    .println("Matheus Saraiva"
    );
     }
    }
    

    agora o arquivo que chamará a função printNome do arquivo1 .java

     

    //arquivo 2 .java
    
    
    public
     class
     ImprimeNome {
    
     MeuNome meunome = new
     MeuNome();
    
     public
     void
     Imprimir(){
    
      System.out
    .println("Meu nome é:"
    );
      meunome.printNome();
     }
    }
    
    Assim é feita normalmente como se as duas classes estivessem no mesmo arquivo .java por padrão o compilador procura o outro arquivo dentro do mesmo diretório, se este estiver em diretorio diferente deverá ser informado com import (import arquivo.esta.aqui;)

     

    Mas como funciona essa questão em C++, ou melhor, C++/CLI.

    Grato!


    Visual C++..... A mais complexa...... A mais poderosa
    quinta-feira, 1 de julho de 2010 15:55

Respostas

  • Bom, o padrão não é necessáriamente este. O Visual Studio convencionou desta maneira o caso de Windows Forms com C++/CLI. Na MFC por exemplo, os .h é para declaração e .cpp é para implementação.

    >> Se eu escrever uma classe que será objeto para realizar alguma tarefa referente a uma regra de negócio, onde devo escrever? cpp ou .h?

    MinhaRegra.h

    ref struct MinhaRegra

    {

    bool ValidarXYZ( int xyz );

    };

    MinhaRegra.cpp

    bool MinhaRegra::ValidarXYZ( int xyz )

    {

    return 0 == xyz % 2;

    }

     

    ConsumindoMinhaRegra.h //declaração

    void ConsomeMinhaRegra();

     

    ConsumindoMinhaRegra.cpp //implementacao

    #include "ConsumindoMinhaRegra.h"

    #include "MinhaRegra.h"

    void ConsomeMinhaRegra()

    {

    MinhaRegra mr;

    mr.ValidarXYZ( 42 );

    }

    >> geralmente sempre crio uma classe para fazer validações de datas, documentos como CPF, CNPJ, etc.. Onde fazer isso .h ou cpp?

    Declarações no .h e Implementações no .cpp. Se tiver usando templates, só vai ser no .h!


    Fabio Galuppo
    • Marcado como Resposta matheusssilva quinta-feira, 8 de julho de 2010 21:32
    • Editado Fabio Galuppo quinta-feira, 8 de julho de 2010 22:15
    quinta-feira, 8 de julho de 2010 21:07

Todas as Respostas

  • Olá Matheus,

    Suas assinaturas são bem divertidas : "Visual C++..... A mais complexa...... A mais poderosa". Eu mesmo fazia comentários deste tipo, certa vez ministrei uma palestra entitulada: "Programadores de Verdade usam C++". Bons tempos...

    Focando no problema.

    No caso de C++ (e no C++/CLI tbm), este é o modelo de compilação adotado. A declaração é separada da definição, isto é herdado do C. Por outro lado, o C++ suporta algo chamado single compilation unit para otimizar este modelo de compilação (http://en.wikipedia.org/wiki/Single_Compilation_Unit)

    Ou seja, os tipos declarados no .hpp serão acessados apenas por quem referenciar seu header.

    O autor deve ter optado por colocar tudo no .h pois deve estar usando em apenas 1 local o main, correto? Senão poderia haver problemas, no caso poderiam ser corrigidos por #pragma once ou um "include guard".

     Responde as dúvidas:

    1. pq colocar tudo em um header?

    Não precisa colocar tudo em um único header, podem haver mais.

    2. Não pra pra colocar tudo dentro do arquivo cpp?

    Sim, se todo seu programa ficar num único arquivo .cpp que estiver o main.

    3. suponha que em um arquivo .cpp eu queira usar um método que está em outro arquivo .cpp, como fazer essa referencia?

    Somente via header compartilhado.

    Grande abraço,

    Fabio Galuppo


    Fabio Galuppo
    • Marcado como Resposta matheusssilva sexta-feira, 2 de julho de 2010 22:37
    • Não Marcado como Resposta matheusssilva quarta-feira, 7 de julho de 2010 21:55
    quinta-feira, 1 de julho de 2010 17:06
  • Opá e ai galuppão :)

    Pois é com relação a assinnatura, acredito sim que C++ é a linguagem mais poderosa do visualstudio apesar de sofrer fortes boicotes da MS. Ela é dodata de caracteristicas unicas que não existem em nenhuma outra linguagem MS. Pelo visto vc é mais um que teve o C# empurrado goela abaixo e já teve tanta indigestão que seu organismo já se adptou e hoje vc mastiga sem fazer careta.

    Voltando ao tópico,

    Acho que entendi, não é uma regra, é mais como um padrão adotado, é isso? Sim ele está sendo usado apenas em main(). E tb está sendo usado a diretiva #pragma once (que ainda não sei pra que serve). Só acho estranho colocar toda a declaração e propriedades do Formulario principal de uma aplicação em um arquivo .h. Penso que o normal seria usar os headers somente para se referencia a um outro arquivo .cpp.

    Cara não sei se durante esse tempo eu estava errado mas eu vejo os arquivos header apenas como bridge entre um arquivo cpp e outro, entre uma biblioteca e seu consumidor, etc... Não para conter código fonte grande de uma aplicação.

    Mas seu resolvesse fazer tudo usando apenas arquivos .cpp, ou melhor, dois arquivos cpp, um para conter as definições do formulário, propriedades, eventos, etc e outro arquivo .cpp com a função main() para executar a aplicação. O que conteria no arquivo header se eu fiz tudo usando arquivos cpp?

    Valeu galuppão!


    Visual C++..... A mais complexa...... A mais poderosa
    quinta-feira, 1 de julho de 2010 19:53
  • Fala Matheus,

    Bom, em relação as linguagens de programação eu sou poliglota. Procuro usar a melhor ferramenta na melhor situação. Isto inclui C++, C++/CLI, C#, F#, Objective-C, entre mais algumas... A grande vantagem de algumas destas linguagens é que elas possuem  estruturas similares ou baseadas em C++.

    Eu também acho C++ uma linguagem muito poderosa - pela simplicidade de suas abstrações e poder de acessar low-level. Ela é multiparadigma e isto permite construções bem legais. Ainda mais agora com C++0x, suporte a lambda, inferencia de tipos e variadic templates. Não há como questionar e comparar outras linguagens quando o assunto é eficiência! Por outro lado, eu admiro MUITO F# e mais recentemente Haskell pela expressividade da programação funcional.

    Para escolher uma (ou mais) linguagens é necessário entender os requisitos para sua aplicação. É interessante, pois o Halo 3 tem o engine escrito em C++, mas ele é todo "scriptado" com Python. Impressionante, não é mesmo?

    Switch to Topic...

    Vc não está errado, os arquivos .h também servem como bridge. Mas tbm suportam total implementação em si, principalmente quando vc usa templates - que é resolvido em tempo de compilação, ou seja você precisa do código fonte - por isto que a STL, ATL são distribuidas com o Visual C++ :-).

    Esta divisão com C++/CLI deve ter sido convencionada pelo time da IDE. De qq forma, após compilado o assembly vc não precisa distribuir nada além do assembly.

    Se vc fizer só usando .cpp (supondo 2 .cpps e 1 .cpp com o main), vc terá problemas pois o main não encontrará as declarações dos outros .cpps. Então o .h indica as declarações (ou o que seu programa suporta internamente).

    Uma outra abordagem para se livrar dos .h em C++/CLI, é ter 2 projetos (1 dll e 1 executável que referencia esta dll). Na dll vc implementa todos os tipos nos seus respectivos .cpp (neste caso os tipos deverão ser independentes, ou seja um tipo de um .cpp não pode referenciar o outro em outro .cpp). E o executável adiciona referencia a esta .dll. Deste modo vc tem um comportamento semelhante a C# ou Java.

    Falou,

    Fabio Galuppo

     

     

     


    Fabio Galuppo
    • Marcado como Resposta matheusssilva sexta-feira, 2 de julho de 2010 22:37
    • Não Marcado como Resposta matheusssilva quarta-feira, 7 de julho de 2010 21:54
    sexta-feira, 2 de julho de 2010 17:12
  • Ok, estou quase concluindo o livro, logo logo estarei colocando a mão na massa, ainda ficaram algumas dúvidas mas vou esperar para ver se elas não são respondidas no restante do livro, caso não seja postarei aqui quando começar a desenvolver.

    Valeu! Até a próxima!


    Visual C++..... A mais complexa...... A mais poderosa
    sexta-feira, 2 de julho de 2010 22:26
  • Com o avanço na leitura surgiu outra dúvida. Ja que por padrão toda a interface gui da aplicação fica em arquivos .h, em quais casos se aplica o uso dos .cpp? A aplicação terá apenas um arquivo .cpp que é onde ficará o main? Estou com essa dúvida terrivel pois o autor em nenhum momento separou os exemplo em outros arquivos. Todos foram feitos dentro do mesmo arquivo cpp, apenas na parte de interface gráfica foi que ele separou em arquivo .h e todos nois sabemos que é totalmente inviavel escrever uma aplicação toda em um só arquivo. Se a gui é feita em .h em que se usa os .cpp?

    Se eu escrever uma classe que será objeto para realizar alguma tarefa referente a uma regra de negócio, onde devo escrever? cpp ou .h? Um caso bem cumum, geralmente sempre crio uma classe para fazer validações de datas, documentos como CPF, CNPJ, etc.. Onde fazer isso .h ou cpp?

    Sem querer abusar.... Dá pra sair um exemplo simples? Tipo um arquivo cpp instanciando uma classe que está em outro arquivo cpp e executando seus métodos. E o que fica no arquivo .h que possibilita isso?

    Valeu!


    Visual C++..... A mais complexa...... A mais poderosa
    quarta-feira, 7 de julho de 2010 22:05
  • Bom, o padrão não é necessáriamente este. O Visual Studio convencionou desta maneira o caso de Windows Forms com C++/CLI. Na MFC por exemplo, os .h é para declaração e .cpp é para implementação.

    >> Se eu escrever uma classe que será objeto para realizar alguma tarefa referente a uma regra de negócio, onde devo escrever? cpp ou .h?

    MinhaRegra.h

    ref struct MinhaRegra

    {

    bool ValidarXYZ( int xyz );

    };

    MinhaRegra.cpp

    bool MinhaRegra::ValidarXYZ( int xyz )

    {

    return 0 == xyz % 2;

    }

     

    ConsumindoMinhaRegra.h //declaração

    void ConsomeMinhaRegra();

     

    ConsumindoMinhaRegra.cpp //implementacao

    #include "ConsumindoMinhaRegra.h"

    #include "MinhaRegra.h"

    void ConsomeMinhaRegra()

    {

    MinhaRegra mr;

    mr.ValidarXYZ( 42 );

    }

    >> geralmente sempre crio uma classe para fazer validações de datas, documentos como CPF, CNPJ, etc.. Onde fazer isso .h ou cpp?

    Declarações no .h e Implementações no .cpp. Se tiver usando templates, só vai ser no .h!


    Fabio Galuppo
    • Marcado como Resposta matheusssilva quinta-feira, 8 de julho de 2010 21:32
    • Editado Fabio Galuppo quinta-feira, 8 de julho de 2010 22:15
    quinta-feira, 8 de julho de 2010 21:07
  • Só o senhor mesmo para me dá essas explicações galuppão. Infelizmente isso é comun nos livros sobre linguagens de programação, os autores se predem a fazer tudo num mesmo arquivo ai quando o leitor vai por a mão na massa fica se perguntando como dividir o código fonte em vários arquivos.

    Bem nessa parte c++ fica um pouco mais trabalhoso pois quando se criar uma classe para se instanciada vc terá que fazer em duas etapas (declarar tudo num .h e depois implementar no .cpp). Mas pelomenos ganharei produtividade da GUI, pois a gui do java é muito precária, coisas simples que com Windows Forms você consegue apenas setando numa propriedade, no java tem que criar toda uma estrutura de classe. Um exemplo disso é a aplicação de mascaras em TextFields, windows forms tem um um componente especifico para receber mascaras, no java o cara usa um textfield comum e tem que criar uma classe para controlar e gerar a mascara, ai você aplica essa classe através de um SET no textfield.

    Ou seja, insterface gráfica no java é extremamente improdutivo. Win32 tb é mas como recompenssa vc ganha leveza e muita velocidade.

    Valeu brother, ficou totalmente clara essa parte agora.


    Visual C++..... A mais complexa...... A mais poderosa
    quinta-feira, 8 de julho de 2010 21:25
  • Interessante este seu comentário sobre Java. Eu só interagi com ele para entender o modelo das bibliotecas de concorrencia (JSR 166) e fuçar um pouco em JNI (pois o assunto interop é do meu interesse). De resto não tenho experiência prática e aplicada dele, apesar de eu conseguir ler e entender um source code nesta linguagem!

    Com certeza Win32 é bem rápido tbm na parte de GUI. Legal que esteja mandando ver ai com C++/CLI...


    Fabio Galuppo
    quinta-feira, 8 de julho de 2010 22:22