C++ templates  XML
Índice dos Fóruns » Outras Linguagens
Autor Mensagem
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
[MSN]
rodrigo.bossini
GUJ Master
[Avatar]

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

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

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

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

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

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