esfomeado Posted December 17, 2012 at 08:21 PM Report #487550 Posted December 17, 2012 at 08:21 PM Para um trabalho da escola tenho que fazer um colecao hibrida que guarda jogadores! O problema é quando vou para fazer um "print" de todos os jogadores da colecao apenas é mostrado o 1º. Codigo para add a colecao: Jogador *j = new Jogador(num, nome, sbase); return jogadores.insert(j); Codigo para mostrar todos os jogadores: ColecaoHibrida<Jogador*>::iterator it; for(it = jogadores.begin(); it != jogadores.end(); it++) (*it)->print(); Alguem sabe qual sera o problema?
HappyHippyHippo Posted December 17, 2012 at 08:29 PM Report #487551 Posted December 17, 2012 at 08:29 PM é impossivel sem ver a implementação da classe IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
HappyHippyHippo Posted December 17, 2012 at 08:42 PM Report #487557 Posted December 17, 2012 at 08:42 PM nenhuma das linhas de código apresentadas é necessária. a questão era sobre uma classe template algo que não apresentaste ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
esfomeado Posted December 17, 2012 at 08:43 PM Author Report #487560 Posted December 17, 2012 at 08:43 PM nenhuma das linhas de código apresentadas é necessária. a questão era sobre uma classe template algo que não apresentaste ... ///////////////ColecaoHibrida.h (vrs. 18/Nov/12)//////////////// #pragma once #include<set> using namespace std; template<class T> class less_pointers { public: bool operator()(const T &left, const T &right) const { return (*left < *right); } }; template<class K> class ColecaoHibrida: public set<K, less_pointers<K>> { public: bool insert(const K &c); K find(const K &c); int size() const; void erase(const K &); //void clear(); //bool empty() const; //iterator begin(); //iterator end(); }; template<class K> bool ColecaoHibrida<K>::insert(const K &c) { pair<set<K, less_pointers<K>>::iterator, bool> r=set<K, less_pointers<K>>::insert(c); return(r.second); } template<class K> K ColecaoHibrida<K>::find(const K &c) { K r=0; set<K, less_pointers<K>>::iterator i=set<K, less_pointers<K>>::find(c); if(i!=set<K, less_pointers<K>>::end()) r=*i; return(r); } template<class K> int ColecaoHibrida<K>::size() const{ return((int)set<K, less_pointers<K>>::size()); } template<class K> void ColecaoHibrida<K>::erase(const K &c ) { set<K, less_pointers<K>>::erase(c); }
HappyHippyHippo Posted December 17, 2012 at 09:11 PM Report #487565 Posted December 17, 2012 at 09:11 PM antes do mais, não necessitas de redefinir todas essas funções da classe set. elas já estão implementadas. segundo, verifica se não estás a inserir elementos com o mesmo key exemplo: #include <iostream> #include <set> using namespace std; template<class T> class less_pointers { public: bool operator()(const T &left, const T &right) const { return (*left < *right); } }; template<class K> class ColecaoHibrida: public set<K, less_pointers<K> > { }; class Teste { public: int key; int value; Teste(int key, int value) : key(key), value(value) {} int getKey() { return key; } int getValue() { return value; } bool operator<(const Teste& t) {return this->key < t.key;} }; int main() { ColecaoHibrida<Teste *> c; c.insert(new Teste(1, 2)); // OK c.insert(new Teste(2, 20)); // OK c.insert(new Teste(3, 202)); // OK c.insert(new Teste(4, 2020)); // OK c.insert(new Teste(2, 30)); // ERROR : DUPLICATE KEY for (ColecaoHibrida<Teste *>::iterator iter = c.begin(); iter != c.end(); iter++) { cout << "Teste key = " << (*iter)->getKey() << " | value = " << (*iter)->getValue() << endl; } return 0; } IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
esfomeado Posted December 17, 2012 at 09:16 PM Author Report #487566 Posted December 17, 2012 at 09:16 PM A classe template foi-me fornecida pelo professor. As keys estao diferentes. O problema ainda persiste!
HappyHippyHippo Posted December 17, 2012 at 09:38 PM Report #487573 Posted December 17, 2012 at 09:38 PM ok ... estive a ver as tuas funções (ou dadas pelo professor) e vi um erro. é um problema chato e é normalmente esquecido pelas pessoas que programam em C++ 1º de tudo nem sei como isso compila ... o código como está não compila, ponto. agora os erros: // a declaração de templates dentro de templates necessita de espaços por senão estas a escrever o right-shift-logical if(i!=set<K, less_pointers<K> >::end()) // A // | tem que levar um espaço !!! // agora o mais complicado // para o compilador, quando fazes "Class::xpto", ele pensa que estás a aceder a um parâmetro da classe // por outra palavras, ele não interpreta isto como um tipo de dados // é o que tens quando fazes: set<K, less_pointers<K> >::iterator i; // set<K, less_pointers<K> >::iterator não é considerado como um tipo, mas como aceder a um parâmetro da classe // para resolver este tipo de problemas, existe uma palavra reservada "typename" que indica que a declaração seguinte é um tipo de dados typename set<K, less_pointers<K> >::iterator i; // A // | declarar que o ::iterator é um tipo de dados // é isso que tens de adicionar dentro das funções, sempre que declaras uma classe iterador se depois de corriguir isto, e mesmo assim continuares a ter o mesmo problema, o erro está noutro local IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
esfomeado Posted December 17, 2012 at 09:42 PM Author Report #487575 Posted December 17, 2012 at 09:42 PM O codigo com ou sem isso compila na mesma perfeitamente e o problema ainda continua. Se quiseres e tiveres algum tempo disponivel poderei-te enviar o projecto todo para dares uma vista de olhos 😛
HappyHippyHippo Posted December 17, 2012 at 09:44 PM Report #487577 Posted December 17, 2012 at 09:44 PM O codigo com ou sem isso compila na mesma perfeitamente e o problema ainda continua. Se quiseres e tiveres algum tempo disponivel poderei-te enviar o projecto todo para dares uma vista de olhos 😛 se compila, tens um problema de compilador (que pelo código apresentado é o VSC++) ... se tens então o código, mete-o num dropbox ou outra coisa que eu dou uma vista de olhos ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now