Dúvida gerais em C++  XML
Índice dos Fóruns » Outras Linguagens
Autor Mensagem
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

Adelar
GUJ Master
[Avatar]

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
[WWW] [MSN]
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.
Adelar
GUJ Master
[Avatar]

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
[WWW] [MSN]
ViniGodoy
Moderador
[Avatar]

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
[WWW]
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.
ViniGodoy
Moderador
[Avatar]

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
[WWW]
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.
ViniGodoy
Moderador
[Avatar]

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
[WWW]
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?
Adelar
GUJ Master
[Avatar]

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
[WWW] [MSN]
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).
Adelar
GUJ Master
[Avatar]

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
[WWW] [MSN]
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, ... ?
Adelar
GUJ Master
[Avatar]

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
[WWW] [MSN]
 
Índice dos Fóruns » Outras Linguagens
Ir para:   
Powered by JForum 2.1.8 © JForum Team