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…
Outra coisa. Você está trabalhando mesmo com tudo no .h? Ou você só contrai para postar aqui no GUJ?
V
ViniGodoy
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.
Ele é o mais parecido possível com um Object que você pode ter em C++.
V
ViniGodoy
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.
L
lucas_carvalho100
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…
E
entanglement
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))
E
entanglement
// Exemplo de programação com boost::variant#include<boost/variant.hpp>#include<boost/variant/get.hpp>#include<boost/foreach.hpp>#include<iostream>#include<vector>#include<string>usingnamespaceboost;usingnamespacestd;typedefvector<int>INTVECTOR;typedefboost::variant<int,double,string,INTVECTOR>MYVARIANT;intmain(intargc,char*argv[]){vector<MYVARIANT>myvs;INTVECTORiv;iv.push_back(3);iv.push_back(1);iv.push_back(4);iv.push_back(1);myvs.push_back(10);myvs.push_back(20.4);myvs.push_back(string("hare hare"));myvs.push_back(iv);BOOST_FOREACH(MYVARIANTvar,myvs){switch(var.which()){case0:// intcout<<get<int>(var)<<endl;break;case1:// doublecout<<get<double>(var)<<endl;break;case2:// std::stringcout<<get<string>(var)<<endl;break;case3:// vector<int>BOOST_FOREACH(intx,get<INTVECTOR>(var)){cout<<x<<", ";}cout<<endl;break;default:break;}}}
E
entanglement
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.
L
lucas_carvalho100
Obrigado entanglement por postar o código, achei muito interessante, ainda não conhecia essa estrutura, vou fazer alguns testes com ela.
Obrigado.
L
lucas_carvalho100
entanglement ainda não fiz os testes, estava lendo o código e surgiu uma duvida, o que acontece se eu inserir dessa forma: