Atributo genérico no C++  XML
Índice dos Fóruns » Outras Linguagens
Autor Mensagem
lucas_carvalho100
JavaEvangelist
[Avatar]

Membro desde: 18/03/2010 08:23:16
Mensagens: 322
Offline

Pessoal alguém sabe se tem alguma forma de criar um atributo genérico no C++?, tipo um "object"...

Vou tenta ser bem claro....

Criei um método com template, até ai beleza, só que não consegui fazer funcionar template com o atributo da classe, dá um erro e o V.S para de funcionar....

Segue o código...


Preciso de alguma lista que aceite qualquer objeto... Não precisa necessariamente usar o vector..

Qualquer duvida estou a disposição.

Obrigado.

"A mente que se abre a uma nova idéia jamais voltará ao seu tamanho original."
Albert Einstein
[WWW]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

Não entendi o que você quer. O vector aceita qualquer tipo de objeto.

Você pode fazer isso aqui:



Ou então, se quiser deixar tudo genérico:




Outra coisa. Você está trabalhando mesmo com tudo no .h? Ou você só contrai para postar aqui no GUJ?

This message was edited 2 times. Last update was at 18/11/2010 14:05:32


@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

Outra coisa. Lembre-se que no C++, o vector trabalha por valor. Isso significa que adicionar objetos e retira-los do vector irá chamar o construtor de cópia. Cuidado também que não existe "polimorfismo por valor".

Uma opção é ter um vector de ponteiros. Outra, ainda melhor, é trabalhar com smart pointers.


Além disso, vale ressaltar que templates e generics são coisas completamente diferentes. Templates são muitíssimo mais poderosos e efetivamente eliminam restrições de tipos de maneira typesafe. Generics já servem para reforçar o sistema de tipos. Não trate os dois como se fossem a mesma coisa.

This message was edited 1 time. Last update was at 18/11/2010 14:10:36


@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]
lucas_carvalho100
JavaEvangelist
[Avatar]

Membro desde: 18/03/2010 08:23:16
Mensagens: 322
Offline

Estou usando tudo no .h mesmo(somente para essa classe referencia http://www.linhadecodigo.com.br/artigo/1672/B%C3%A1sico-de-C-Templates.aspx), pq como estou usando templates o compilador não consegue compilar, ele da um erro de link, pois estou montando uma espécie de "biblioteca".

A forma de como queria o vetor ou lista seria assim...


Logo esse atributo condições aceitaria qualquer tipo, int, string, char e etc....

Não quero usar o template em toda a classe pois uma vez que a classe for instanciada, a lista pode aceitar qualquer tipo..

Entendeu o problema?

Desculpe ter misturado generic com template...

"A mente que se abre a uma nova idéia jamais voltará ao seu tamanho original."
Albert Einstein
[WWW]
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

O C++ não tem um "tipo objeto" (ou seja, pai de todas as classes) como o Java. Pensar em Java nem sempre é muito adequado em C++.

Então fica difícil você ter um "vetor de objetos" tal como há um "ArrayList<Object>".

Se você usar o boost, pode usar o tipo boost::variant que se comporta como um tipo que pode comportar vários tipos de objetos.

entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

boost::variant: http://beta.boost.org/doc/libs/1_44_0/doc/html/variant.html

Ele é o mais parecido possível com um Object que você pode ter em C++.
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

Ainda assim, mesmo em java, um vector<object> é uma péssima alternativa de projeto. Exige casts, é difícil de trabalhar.

O que exatamente você quer fazer? Talvez seja interessante criar sua própria abstract base class.


Sim, no caso de templates é obrigatório colocar .h e .cpp no mesmo arquivo. Perguntei pq vc já passou outros exemplos aqui com tudo junto, e esse é um erro relativamente comum de quem do Java vai pro C++ e sai programando.

@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]
lucas_carvalho100
JavaEvangelist
[Avatar]

Membro desde: 18/03/2010 08:23:16
Mensagens: 322
Offline

Bem eu programo tudo separado, .h e .cpp esse foi o único que fiz assim(pq ele me obriga)...

Bem estou montando uma classe para conectar no oracle, a biblioteca occi da oracle não funciona nem com "reza braba"(lembra postei até alguns post sobre isso), então achei uma biblioteca chamada OTL, ela usa a OCI da própria oracle mesmo, essa funcionou muito bem, no primeiro teste que fiz funcionou, no entanto ela não é muito funcional, então estou montando uma classe que conecta,executa a consulta e retorna os dados para outra classe, +/- como o Statement e o ResultSet no caso do java, esse trabalho tem o intuito de facilitar o trabalho de acesso a dados.....

Enfim e é por isso que esta precisando de uma lista de objetos de que aceite qualquer estrutura....

As vezes vocês podem pensar em outra idéia melhor, estou aberto a sugestões....

Obrigado....


"A mente que se abre a uma nova idéia jamais voltará ao seu tamanho original."
Albert Einstein
[WWW]
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

Então não é "qualquer coisa".
É um dos tipos que podem ser tipos de colunas em uma tabela: numérico, string etc.
O boost::variant, no seu caso, deve cair como uma luva.
Embora o exemplo na página que lhe passei faça um variant que aceita apenas 2 tipos (int & string), é possível passar até 20 tipos diferentes, o que é mais que suficiente para todos os tipos que podem ser retornados pelo Oracle (espero))
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

O BOOST_FOREACH é mais ou menos o equivalente ao foreach do Java . Em uma versão posterior da especificação do C++ (que ainda não foi fechada, chamada C++0X) está previsto ter algo parecido (e até com a mesma sintaxe e significado) do foreach do Java.
lucas_carvalho100
JavaEvangelist
[Avatar]

Membro desde: 18/03/2010 08:23:16
Mensagens: 322
Offline

Obrigado entanglement por postar o código, achei muito interessante, ainda não conhecia essa estrutura, vou fazer alguns testes com ela.

Obrigado.

"A mente que se abre a uma nova idéia jamais voltará ao seu tamanho original."
Albert Einstein
[WWW]
lucas_carvalho100
JavaEvangelist
[Avatar]

Membro desde: 18/03/2010 08:23:16
Mensagens: 322
Offline

entanglement ainda não fiz os testes, estava lendo o código e surgiu uma duvida, o que acontece se eu inserir dessa forma:



Ele reconhece que é string e insere ou ele pensa que é um vector e da erro?

This message was edited 1 time. Last update was at 18/11/2010 17:37:27

[WWW]
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

Reconhece que é string. Isso é porque o tipo foi explicitamente passado, nesse caso.

"Hare hare" pra você também!
 
Índice dos Fóruns » Outras Linguagens
Ir para:   
Powered by JForum 2.1.8 © JForum Team