| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/08/2010 21:54:57
|
Schuenemann
GUJ Ranger
Membro desde: 13/01/2005 12:31:27
Mensagens: 854
Offline
|
Oi.
Tenho uma pequena aplicação em PHP. Inicialmente pensei em rodá-la na Web, mas daí mudei de ideia e resolvi que seria desktop. Como seria ruim para os usuários ter que baixar um runtime, achei melhor converter as classes e testes para C++. Estou usando a IDE Code::Blocks e querendo usar wxWidgets.
Andei lendo um pouco sobre C++, mas não entendi muito. A começar pela separação de uma classe em interface (h) e implementação (cpp). Olha a classe que a IDE gerou:
Char.h
Char.cpp
Dúvida:
1- O código dentro de Char.cpp pertencerá obrigatoriamente à classe descrita no .h?
2- Essa estrutura é adequada? Qual a vantagem de separar a classe em 2 arquivos?
3- Tentei incluir um método com o uso de "this" e não consigo. Por quê? (abaixo)
Char.h
Char.cpp
invalid use of "this" in non-member function
Tanto faz setLevel ou Char::setLevel.
This message was edited 1 time. Last update was at 17/10/2010 10:28:34
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/08/2010 22:15:38
|
Adelar
GUJ Master
![[Avatar]](/images/avatar/4ad38ecf2884a47a5efa657f3358e635.jpg)
Membro desde: 31/10/2008 10:07:36
Mensagens: 1237
Localização: Cascavel
Offline
|
Olá,
já faz tempo que não mecho com C++ mas acho que consigo responder...
1. Sim, pois o .h é o mapeamento de tudo que deve ser acessível no cpp
2. É adequada e necessária, pois é através do .h que o .cpp pode ser usado como biblioteca para outros códigos
3. A sintaxe está incorreta... no c++ usa-se o operador ->:
segue um exemplo de uso do this http://gracianotorrao.wordpress.com/2009/01/01/o-apontador-this-c/
Att.
|
"Errando e aprendendo com os bugs"
http://www.cajuscript.org |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/08/2010 22:43:24
|
Schuenemann
GUJ Ranger
Membro desde: 13/01/2005 12:31:27
Mensagens: 854
Offline
|
Então this é um ponteiro.
Funcionou dessa forma:
Mas precisei declarar o level como private no Char.h.
Meio estranho para mim ter que reclarar membros privados lá. Então o .h não é só a interface da classe.
Também é bem esquisito ter que usar o operador de escopo o tempo inteiro para implementar a classe.
Obrigado.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/08/2010 23:11:03
|
Adelar
GUJ Master
![[Avatar]](/images/avatar/4ad38ecf2884a47a5efa657f3358e635.jpg)
Membro desde: 31/10/2008 10:07:36
Mensagens: 1237
Localização: Cascavel
Offline
|
Schuenemann wrote:Também é bem esquisito ter que usar o operador de escopo o tempo inteiro para implementar a classe.
No caso do C++ há duas formas de implementar os métodos (ou funções): dentro ou fora da classe. Daí o operador :: é utilizado para indicar de qual classe o método pertence. Já a primeira forma é geralmente utilizada para pequenos códigos.
Att.
|
"Errando e aprendendo com os bugs"
http://www.cajuscript.org |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/08/2010 01:47:43
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
Schuenemann wrote:1- O código dentro de Char.cpp pertencerá obrigatoriamente à classe descrita no .h?
Não necessariamente. Não há nenhuma obrigação quanto à isso no cpp, embora seja uma boa prática. O cpp apenas exige que a definição (feita no .h) venha antes da implementação. Você pode inclusive declarar os dois no mesmo arquivo, ou fazer a implementação de um .h em dois arquivos .cpp, embora isso não seja uma boa prática.
Schuenemann wrote:2- Essa estrutura é adequada? Qual a vantagem de separar a classe em 2 arquivos?
Você separa a definição da implementação. Isso evita que seu código seja recompilado quando somente a implementação, e não a interface da classe, muda. Dá uma lida nesse artigo: http://www.pontov.com.br/site/index.php/cpp/46-conceitos-basicos/95-compilacao-de-programas-cc E, principalmente, nesse aqui: http://www.caloni.com.br/blog/archives/declaracao-x-definicao O C++ deixa as partes privadas junto da interface da classe, pois ele precisa saber o tamanho físico da classe, para que possa alocar memória corretamente. E para conhecer exatamente esse tamanho, é necessário conhecer o que há de privado. Infelizmente, isso quebra um pouco o encapsulamento, já que um programador de posse do .h, sabe o que a classe tem de privado. É necessário entender um pouco melhor como o C++ gerencia isso. Outra coisa. O arquivo que implementa o .h não precisa ser um código fonte. Pode ser uma library estática, já compilada. Tome cuidado que o c++ é muito diferente do Java. Não tente programar em um como você faz no outro. Isso vai levar a um código ruim. Procure pegar um bom livro de cpp (como o do Deitel) e ver as diferenças. E, claro, depois disso, pegar um effective c++ da vida não faz mal a ninguém.
This message was edited 2 times. Last update was at 29/08/2010 01:54:01
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/08/2010 15:17:12
|
Schuenemann
GUJ Ranger
Membro desde: 13/01/2005 12:31:27
Mensagens: 854
Offline
|
Beleza, deu pra entender um pouco melhor.
ViniGodoy wrote:
Procure pegar um bom livro de cpp (como o do Deitel) e ver as diferenças.
Não tem uma sugestão melhor, não? Eu tinha esse livro, mas passei adiante pra alguém aqui do GUJ porque é insuportável.
5 páginas pra explicar o que é um for pode ser aceitável pra um iniciante, mas pra quem já programa em alguma coisa, não dá
Pelo menos por agora não vou fazer nada avançado. O programa é praticamente manipulação de um arquivo binário. É um editor de um jogo.
Vou precisar ver como fazer a interface gráfica com o wxWidgets de forma portável.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/08/2010 15:38:08
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
Schuenemann wrote:Não tem uma sugestão melhor, não? Eu tinha esse livro, mas passei adiante pra alguém aqui do GUJ porque é insuportável.
5 páginas pra explicar o que é um for pode ser aceitável pra um iniciante, mas pra quem já programa em alguma coisa, não dá 
Mas era o de C++ que você tinha? Pq o de C++ do Deitel é 100x melhor que o de Java.
De qualquer forma, você pode baixar o livro indicado no meu roadmap:
http://www.pontov.com.br/site/index.php/cpp/46-conceitos-basicos/88-roadmap-c
Ele é bem mais direto.
Schuenemann wrote:Pelo menos por agora não vou fazer nada avançado. O programa é praticamente manipulação de um arquivo binário. É um editor de um jogo.
Vou precisar ver como fazer a interface gráfica com o wxWidgets de forma portável.
Boa sorte. Qualquer dúvida é só perguntar por aqui.
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/08/2010 15:54:52
|
Schuenemann
GUJ Ranger
Membro desde: 13/01/2005 12:31:27
Mensagens: 854
Offline
|
Ele mesmo. Acho os Deitel muito chatos.
Só recomendo pra quem é completamente iniciante, não só na linguagem, como também em programação. Qualquer um que programe sabe o que é uma variável, uma estrutura de repetição etc. Só falta saber a sintaxe e as particularidades daquela linguagem.
Vou ver sua sugestão.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/08/2010 16:18:24
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
Se você sabe programar, pegue um livro mais de referência sobre a sintaxe.
Pode ser o do André Bueno, indicado ali no site, ou mesmo uma apostila.
E, assim que dominar a sintaxe básica, parta para um Effective da vida.
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 25/09/2010 21:51:16
|
Schuenemann
GUJ Ranger
Membro desde: 13/01/2005 12:31:27
Mensagens: 854
Offline
|
Surgiu outra dúvida:
Estou pesquisando há algum tempo, mas não achei um jeito de encontrar o tamanho (quantidade de posições) de um array (no caso, de char).
Ele tem 5 posições. sizeof retorna 8. Achei lugares dizendo para dividir esse valor por (* (array)) ou (array[0]), mas retorna 8 de qualquer jeito (o tamanho do char deve ser 1).
Já outro lugar diz que não tem como encontrar o tamanho de um array em tempo de execução. Alguma dica?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/09/2010 11:33:34
|
Adelar
GUJ Master
![[Avatar]](/images/avatar/4ad38ecf2884a47a5efa657f3358e635.jpg)
Membro desde: 31/10/2008 10:07:36
Mensagens: 1237
Localização: Cascavel
Offline
|
Olá,
segue um exemple de como encontrar o tamanho de um vetor de um tipo qualquer:
O valor de tamanho deverá ser igual ao de <QualquerTamanho>. Estou sem um compilador para testar mas acho que é isso.
Att.
This message was edited 1 time. Last update was at 26/09/2010 11:34:21
|
"Errando e aprendendo com os bugs"
http://www.cajuscript.org |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/09/2010 14:17:59
|
Schuenemann
GUJ Ranger
Membro desde: 13/01/2005 12:31:27
Mensagens: 854
Offline
|
Pois é, não dá certo:
Imprime 8. Eu quero o número de posições (5).
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/09/2010 17:22:51
|
Adelar
GUJ Master
![[Avatar]](/images/avatar/4ad38ecf2884a47a5efa657f3358e635.jpg)
Membro desde: 31/10/2008 10:07:36
Mensagens: 1237
Localização: Cascavel
Offline
|
Neste caso, quando o array é alocado dinamicamente, não sei se é possível saber o tamanho dele usando sizeof.
Att.
|
"Errando e aprendendo com os bugs"
http://www.cajuscript.org |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/09/2010 20:58:17
|
Schuenemann
GUJ Ranger
Membro desde: 13/01/2005 12:31:27
Mensagens: 854
Offline
|
Putz... qual seria o motivo dessa limitação? Não é só armazenar o número de posições num atributo do array?
E quais são minhas alternativas? Guardar o tamanho numa variável, usar outro tipo, ... ?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/09/2010 22:06:14
|
Adelar
GUJ Master
![[Avatar]](/images/avatar/4ad38ecf2884a47a5efa657f3358e635.jpg)
Membro desde: 31/10/2008 10:07:36
Mensagens: 1237
Localização: Cascavel
Offline
|
Schuenemann wrote:Putz... qual seria o motivo dessa limitação? Não é só armazenar o número de posições num atributo do array?
E quais são minhas alternativas? Guardar o tamanho numa variável, usar outro tipo, ... ?
O que o operador sizeof retorna o número de bytes ocupados pelo operando, que pode ser uma variável ou um tipo genérico de dado. O problema é como fazer com que o operador ache a região de memória correspondente ao ponteiro. Faz já um tempo que não uso C/C++, mas não me lembro disso ser possível.
Sobre a segunda pergunta, não é possível. Vetores/arrays em C/C++ são somente ponteiros para regiões de memória. Não existem atributos atrelados a estes igual existem em Java. O que pode ser feito é armazenar o tamanho em uma variável de tipo inteiro (tipos int ou long).
A variável inteira seria passada como argumento para as funções que recebem o vetor, da mesma forma que é feita na função main:
Nela o argc indica quantos argumentos foram passados no vetor de ponteiros argv (no qual cada posição aponta para um vetor de char). Não sei se há uma forma melhor, mas vendo pela própria função main do C/C++ tenho minhas dúvidas...
No código acima, a função strlen é utilizada para saber o tamanho das strings de cada uma das posições do vetor. Esta conta a quantidade de caracteres desde a primeira posição até o null ('\0'), que indica o final das strings no C/C++.
Att.
|
"Errando e aprendendo com os bugs"
http://www.cajuscript.org |
|
|
 |
|
|