| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/11/2011 16:03:05
|
renamed
GUJ Ranger
Membro desde: 21/09/2009 08:47:57
Mensagens: 889
Localização: Rio de Janeiro
Offline
|
Oi pessoal
To me aventurando por C++ e estou com dificuldades em templates
Dei uma olhada aqui http://www.cplusplus.com/doc/tutorial/templates/ mas não consegui fazer o que eu queria.
Eu estou fazendo uma classe chamada ListaEncadeada.
Em java, eu sei que podemos fazer
Como fazer algo assim em C++?
Meu .H atualmente está assim
Outra coisa, no meu .cpp eu tive que colocar template <class T> antes de cada método, se eu tirar ele fala que T não existe naquele escopo. Existe alguma forma de só declarar esse T uma vez ou eu que estou fazendo algo errado mesmo?
Obrigado =D
This message was edited 1 time. Last update was at 12/11/2011 16:05:21
|
flw!
===========================
CV: http://lattes.cnpq.br/7235056457600426 |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/11/2011 16:42:00
|
rodrigo.bossini
GUJ Master
![[Avatar]](/images/avatar/3b6fe2dc98ceed6e1608e7cfc662ab11.jpg)
Membro desde: 01/07/2008 20:59:17
Mensagens: 1055
Offline
|
Acho que não entendi bem o que você não está conseguindo fazer, mas acho que esse trecho aqui pode lhe ser útil:
Because templates are compiled when required, this forces a restriction for multi-file projects: the implementation (definition) of a template class or function must be in the same file as its declaration. That means that we cannot separate the interface in a separate header file, and that we must include both interface and implementation in any file that uses the templates.
|
http://www.rodrigobossini.com.br/
Meu Twitter:@rodrigobossini Se uma pessoa fala português há 30 anos e ainda não aprendeu, por que é que vou acreditar que ela está programando em alguma linguagem de programação há apenas 10 anos e sabe o que está fazendo? |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/11/2011 16:52:28
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
Não é necessário descrever o que o template extends, como no Java. No C++, se a "sintaxe" bater, o template poderá ser usado. Se não bater, não.
Por isso dizemos que os templates eliminam o sistema de tipos, e os generics restringem.
E não esqueça que templates normalmente são inteiramente implementados no .h.
|
@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) 12/11/2011 17:05:30
|
renamed
GUJ Ranger
Membro desde: 21/09/2009 08:47:57
Mensagens: 889
Localização: Rio de Janeiro
Offline
|
Oi Rodrigo,
Então eu deveria colocar a implementação dos meus métodos no .H se eu quiser trabalhar com templates?
Oi Vini,
É porque eu queria colocar um método nessa classe que fizesse a ordenação dos elementos, então eu precisava que esse template só aceitasse classes que fossem filhas de uma classe que criei com um método abstrato que compara elementos, que nem java.
Você entendeu o que eu quis fazer? Acha que existe um jeito melhor?
Obrigado aos 2.
|
flw!
===========================
CV: http://lattes.cnpq.br/7235056457600426 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/11/2011 00:25:35
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
Sim. Declare o tipo T e use qualquer método que você quiser, como se ele existisse. O C++ irá autorizar qualquer classe que tenha esse método a usar sua lista, sem a necessidade de uma superclasse.  O detalhe é que, quando alguém tentar usar sua classe, o C++ irá validar se o texto que você escreveu para a template bate com a estrutura da classe ou tipo primitivo para o qual vc tenta instanciar o tipo T. Por exemplo, se você fizer assim: Esse código funcionará para qualquer tipo primitivo, ou para qualquer tipo de usuário que tenha o operador de < sobrecarregado. Mas não funcionará caso esse operador não esteja lá (dá um erro de compilação). Isso é muito flexível e mais poderoso do que os generics jamais sonham em ser. Dica: Ao invés de um método, use o padrão do C++: o operador de <
This message was edited 2 times. Last update was at 13/11/2011 00:29:40
|
@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) 13/11/2011 00:31:14
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
renamed wrote:Então eu deveria colocar a implementação dos meus métodos no .H se eu quiser trabalhar com templates?
Sim, com template vai tudo no .h.
|
@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) 13/11/2011 00:56:02
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
Deixa eu te mostrar um exemplo mais concreto.
O template abaixo aceita qualquer classe que tenha o operador de < sobrecarregado, ou qualquer tipo primitivo ( o < é usado para fazer o ineficiente, mas útil para nosso exemplo, "bubble sort" :
Note que a lista funciona para o tipo primitivo int (pois ele funciona com o < e para a classe String, já que ela também tem o < sobrecarregado:
Na verdade, você pode até mesmo usar a lista sem o operador de < sobrecarregado, desde que jamais chame o método sort() - pois ele é único que exige o operador de <.
Quando estiver usando templates, simplesmente escreva o código que você pretenda que o tipo T respeite, e ele será obrigado a respeitar.
Note também que, diferente do Java, não há necessidade de herança. Com templates, você tem typesafety mas sem restrições de tipo.
O generic tem o objetivo oposto. Aumentar typesafety através de restrições de tipo (antes dele, você tinha que fazer uma lista de Object, que não impunha restrição nenhuma, mas era unsafe).
|
@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) 13/11/2011 13:32:33
|
renamed
GUJ Ranger
Membro desde: 21/09/2009 08:47:57
Mensagens: 889
Localização: Rio de Janeiro
Offline
|
Oi Vini
Ajudou MUITO mesmo!
Eu comecei a testar a aplicação, consegui fazer uma lista de inteiros, na hora que criei uma classe Pessoa ele reclamou, foi só sobrecarregar o operador == que ele parou de reclamar.
Obrigadão mesmo!
This message was edited 1 time. Last update was at 13/11/2011 13:34:17
|
flw!
===========================
CV: http://lattes.cnpq.br/7235056457600426 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/11/2011 16:09:41
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
Troque o parâmetro do operador para const Pessoa&. Isso evita cópia. É uma boa declara-lo como const também.
|
@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) 13/11/2011 19:04:03
|
renamed
GUJ Ranger
Membro desde: 21/09/2009 08:47:57
Mensagens: 889
Localização: Rio de Janeiro
Offline
|
OK Vini
Mais uma vez mto obrigado.
|
flw!
===========================
CV: http://lattes.cnpq.br/7235056457600426 |
|
|
 |
|
|